【问题标题】:Block server-to-server or Postman calls to ASP.NET Core 3.1 API阻止对 ASP.NET Core 3.1 API 的服务器到服务器或 Postman 调用
【发布时间】:2020-11-25 22:28:18
【问题描述】:

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

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

我的大多数端点都受到不记名 JWT 令牌的保护,但我有一个匿名端点,我只想让我控制(或可以配置)的源访问该匿名 API。

【问题讨论】:

  • 不,抱歉。这与 CORS 无关。但是我找到了一种通过使用“TypeFilterAttribute”和“IAuthorizationFilter”创建自己的 Authorize 属性来获得所需内容的方法。可能不适用于所有情况下的每个人,但它帮助我过滤出来源(通过使用“Referer”标题)并在没有匹配时返回 Unauthorized 。似乎适用于各种请求(ajax、Postman、HttpContext.GetAsync 等)

标签: asp.net-core asp.net-core-webapi webapi rest


【解决方案1】:

我在 stackoverflow 上看到这篇文章后解决了这个问题:

How do you create a custom AuthorizeAttribute in ASP.NET Core?

我只是创建了一个自定义的 Authorize 属性[ApiAuthorize()],我这样称呼它:

[ApiController]
[ApiAuthorize(new string[] { "https://localhost:44351", "https://mysite.onthe.net" })]
public class MyInternalApiController : ControllerBase
{
   ...
}

它也可以在Action而不是Controller上实现。实现是这样完成的:

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
  • 处理可以使用 RegEx 或任何好的替代方法来处理子域、通配符等
  • referer 可以转换为 Uri 对象以获得更好的结果和变化
  • jQuery ajax 调用按预期得到“403 - Forbidden”,但 Postman 得到“404 - Not Found”。对我来说,这并不重要,但如果重要,那就需要研究一下。

但它涵盖了我的需要,所以我对此很满意。

【讨论】:

  • 这种方法的问题是我可以将Referer标头添加到Postman,它会通过授权验证。还是我错过了什么?
猜你喜欢
  • 2020-10-22
  • 1970-01-01
  • 2021-03-02
  • 2012-05-04
  • 2010-10-11
  • 1970-01-01
  • 2021-01-29
  • 2020-10-20
  • 1970-01-01
相关资源
最近更新 更多