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

时间:2018-10-17 12:20:51

标签: asp.net-core .net-core asp.net-authorization

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

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

探究Authorization in ASP.NET Core的选项我没有真正看到与我尝试做的匹配。我在想从this问题开始自定义AuthorizeAttribute可以工作,但是无论我做什么,我都没有运气并且得到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是正确的路径...我想念什么?

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

要与IAuthorizationFilter一起使用自己的授权逻辑,请勿与AuthorizeAttribute一起使用,这将检查带有默认身份验证架构的身份验证。

尝试将AuthorizeAttribute更改为Attribute

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