阻止对 ASP.NET Core 3.1 API 的服务器到服务器或 Postman 调用

Posted

技术标签:

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

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

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

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

【问题讨论】:

这能回答你的问题吗? Is there any way to block HTTP requests made by Postman in .NET Core? 不,抱歉。这与 CORS 无关。但是我找到了一种通过使用“TypeFilterAttribute”和“IAuthorizationFilter”创建自己的 Authorize 属性来获得所需内容的方法。可能不适用于所有情况下的每个人,但它帮助我过滤出来源(通过使用“Referer”标题)并在没有匹配时返回 Unauthorized 。似乎适用于各种请求(ajax、Postman、HttpContext.GetAsync 等) 【参考方案1】:

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

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,它会通过授权验证。还是我错过了什么?

以上是关于阻止对 ASP.NET Core 3.1 API 的服务器到服务器或 Postman 调用的主要内容,如果未能解决你的问题,请参考以下文章

Wcf 服务在 .NET Core 3.1 控制台应用程序中工作,但在 ASP.NET Core 3.1 Web API 中无法工作

Asp.net core 3.1 保护 API 和 Web 应用程序

ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL

ASP.NET Core 3.1 和 Angular:将 api 调用重定向到登录页面

即使在配置 ASP.NET Core Web API 中启用了 CORS,CORS 也会阻止发布请求

ASP.NET Core 3.1 中的 Ocelot API Gateway 自定义聚合器问题