Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 阻止对ASP.NET Core 3.1 API的服务器到服务器或邮递员调用_Asp.net Core_Asp.net Core Webapi_Webapi_Restapi - Fatal编程技术网

Asp.net core 阻止对ASP.NET Core 3.1 API的服务器到服务器或邮递员调用

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。我

我有一个ASP.NET Core 3.1 API,我没有使用CORS。据我所知,CORS是一种浏览器。由于我从另一个站点对另一个来源的ajax调用被阻止到API端点(这很好),我仍然可以通过使用Postman或HttpClient和GetAsync()调用到达相同的端点

我的问题是,是否也可以阻止对我的API的服务器到服务器调用(或邮递员调用)?或者像CORS一样,只允许某些来源


我的大多数端点都受到承载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等)