Asp.Net Core 2.1 - 根据请求中的内容授权

Asp.Net Core 2.1 - Authorize based on content in request

我正在公开一个端点以便与第 3 方集成,他们的要求是我根据发布的正文中传递的密钥授权他们对我的端点的请求。然后我的代码将需要验证传递的密钥是否与我这边的某个预定值匹配。传入的模型将如下所示:

public class RequestBase
{
    public string ApiKey { get; set; }
    ...
}

探索 Authorization in ASP.NET Core I don't really see a match for what I am attempting to do. I am thinking a custom AuthorizeAttribute from 问题的选项是可行的,但我没有任何运气,无论我做什么都得到 401。这是我目前所拥有的:

[AttributeUsage(AttributeTargets.Class)]
public class MyAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private static IEnumerable<string> _apiKeys = new List<string>
        {
            "some key... eventually will be dynamic"
        };

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var req = context.HttpContext.Request;
        req.EnableRewind();

        using (var reader = new StreamReader(req.Body, Encoding.UTF8, true, 1024, true))
        {
            var bodyStr = reader.ReadToEnd();
            var isAuthorized = _apiKeys.Any(apiKey => bodyStr.Contains(apiKey));
            if (!isAuthorized)
            {
                context.Result = new StatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
                return;
            }
        }

        req.Body.Position = 0;
    }
}

当在正文中找不到密钥时,将按预期返回 403。但是,当找到密钥时,我得到的结果仍然是 401。几乎好像正在调用 base.OnAuthorization。我还有其他使用标准 AurhorizeAttribute 的端点。仅当我传入 JWT 时,它们才能按预期工作。

问题:

  1. 我使用自定义 AuthorizeAttribute 的方法是否正确,还是有更好的方法?
  2. 如果客户 AuthorizeAttribute 是正确的路径...我错过了什么?

感谢任何帮助!

为了将您自己的授权逻辑与 IAuthorizationFilter 一起使用,您不应与 AuthorizeAttribute 一起使用,后者将使用默认身份验证模式检查身份验证。

尝试将 AuthorizeAttribute 更改为 Attribute

[AttributeUsage(AttributeTargets.Class)]
public class KeyAuthorizeAttribute : Attribute, IAuthorizationFilter
{