Asp.net core 阻止对ASP.NET Core 3.1 API的服务器到服务器或邮递员调用
我有一个ASP.NET Core 3.1 API,我没有使用CORS。据我所知,CORS是一种浏览器。由于我从另一个站点对另一个来源的ajax调用被阻止到API端点(这很好),我仍然可以通过使用Postman或HttpClient和GetAsync()调用到达相同的端点 我的问题是,是否也可以阻止对我的API的服务器到服务器调用(或邮递员调用)?或者像CORS一样,只允许某些来源Asp.net core 阻止对ASP.NET Core 3.1 API的服务器到服务器或邮递员调用,asp.net-core,asp.net-core-webapi,webapi,restapi,Asp.net Core,Asp.net Core Webapi,Webapi,Restapi,我有一个ASP.NET Core 3.1 API,我没有使用CORS。据我所知,CORS是一种浏览器。由于我从另一个站点对另一个来源的ajax调用被阻止到API端点(这很好),我仍然可以通过使用Postman或HttpClient和GetAsync()调用到达相同的端点 我的问题是,是否也可以阻止对我的API的服务器到服务器调用(或邮递员调用)?或者像CORS一样,只允许某些来源 我的大多数端点都受到承载JWT令牌的保护,但我有一个匿名端点,我只想让我控制(或可以配置)的源站访问该匿名API。我
我的大多数端点都受到承载JWT令牌的保护,但我有一个匿名端点,我只想让我控制(或可以配置)的源站访问该匿名API。我在stackoverflow上偶然看到这篇文章后解决了这个问题: 我只是创建了一个自定义的Authorize属性
[apiaauthorize()]
,我这样称呼它:
[ApiController]
[ApiAuthorize(new string[] { "https://localhost:44351", "https://mysite.onthe.net" })]
public class MyInternalApiController : ControllerBase
{
...
}
它也可以在操作上而不是在控制器上实现。实施过程如下所示:
public class ApiAuthorizeAttribute : TypeFilterAttribute
{
public ApiAuthorizeAttribute(string[] origins) : base(typeof(ApiAuthorizeFilter))
{
Arguments = new object[] { origins };
}
}
public class ApiAuthorizeFilter : IAuthorizationFilter
{
readonly string[] _origins;
public ApiAuthorizeFilter(string[] origins)
{
_origins = origins;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
if (_origins == null)
return;
string referer = context.HttpContext.Request.Headers["Referer"].ToString();
if (string.IsNullOrWhiteSpace(referer) || !_origins.Any(origin => referer.StartsWith(origin, StringComparison.OrdinalIgnoreCase)))
context.Result = new ForbidResult();
}
}
需要考虑的事项:
- referer的实现和检查可以是完全匹配的,而不是StartsWith
- 处理可以使用正则表达式或任何好的替代方法来处理子域、通配符等
- 可以将referer转换为Uri对象,以获得更好的结果和变化
- jqueryajax调用得到了预期的“403-禁止”,但Postman得到了“404-未找到”。对我来说,这并不重要,但如果重要的话,这是需要调查的
但它满足了我的需要,所以我很满意。这能回答你的问题吗?不,对不起。这与CORS无关。但我找到了一种方法,通过使用“TypeFilterAttribute”和“IAuthorizationFilter”创建自己的Authorize属性来获得所需的内容。可能在所有场景中都不适用于所有人,但它帮助我过滤出来源(通过使用“Referer”标题),并在没有匹配时返回未经授权。似乎适用于所有类型的请求(ajax、Postman、HttpContext.GetAsync等)