ASP.Net Core 的自定义承载令牌授权

Posted

技术标签:

【中文标题】ASP.Net Core 的自定义承载令牌授权【英文标题】:Custom Bearer Token Authorization for ASP.Net Core 【发布时间】:2018-09-08 02:45:48 【问题描述】:

这是自定义不记名令牌授权机制的可接受实现吗?

授权属性

public class AuthorizeAttribute : TypeFilterAttribute

    public AuthorizeAttribute(): base(typeof(AuthorizeActionFilter))


public class AuthorizeActionFilter : IAsyncActionFilter

    private readonly IValidateBearerToken _authToken;
    public AuthorizeActionFilter(IValidateBearerToken authToken)
    
        _authToken = authToken;
    

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    
        const string AUTHKEY = "authorization";
        var headers = context.HttpContext.Request.Headers;
        if (headers.ContainsKey(AUTHKEY))
        
            bool isAuthorized = _authToken.Validate(headers[AUTHKEY]);
            if (!isAuthorized)
                context.Result = new UnauthorizedResult();
            else
                await next();
        
        else
            context.Result = new UnauthorizedResult();
    

验证服务。 APISettings 类在 appSettings 中使用,但可以扩展验证以使用数据库...显然 :)

public class APISettings

    public string Key  get; set; 


public class ValidateBearerToken : IValidateBearerToken

    private readonly APISettings _bearer;

    public ValidateBearerToken(IOptions<APISettings> bearer)
    
        _bearer = bearer.Value;
    

    public bool Validate(string bearer)
    
        return (bearer.Equals($"Bearer _bearer.Key"));
    

实施

[Produces("application/json")]
[Route("api/my")]
[Authorize]
public class MyController : Controller

应用设置

"APISettings": 
"Key": "372F78BC6B66F3CEAF705FE57A91F369A5BE956692A4DA7DE16CAD71113CF046"

请求标头

Authorization: Bearer 372F78BC6B66F3CEAF705FE57A91F369A5BE956692A4DA7DE16CAD71113CF046

【问题讨论】:

嗨,当内置中间件为您处理时,也许有一点背景知识来说明您为什么这样做?如果您想验证调用方 IP,您可以创建一个中间件。 您有在 ASP.Net Core 中执行此操作的中间件示例吗?与核心团队交谈时,他们说可以使用 identityserver.io 或 openiddict 来完成,请参阅github.com/aspnet/Mvc/issues/7567 【参考方案1】:

这可行,但它有点重新发明***。

这些天我的好方法是使用 JWT,你可以在这里找到更多信息:http://www.jwt.io/

一些优点是它与 asp.net 核心很好地集成,您还可以向令牌添加一些信息(用户名、角色等)。这样,您甚至不需要访问数据库进行验证(如果您愿意的话)。

此外,将密钥存储在 appsettings 文件中可能会导致意外将它们添加到您的源代码管理器(安全性)中。您可以将用户机密用于本地开发(或在 environment = dev 时禁用密钥)和环境变量用于生产。

这是一个如何在 asp.net 中使用 jwt 的好例子:https://jonhilton.net/2017/10/11/secure-your-asp.net-core-2.0-api-part-1-issuing-a-jwt/

【讨论】:

谢谢安德烈,我会去看看。自从写了这个问题后,我已经将它添加到我的数据库存储中,现在工作得很好。赞赏。 很好,@AntonSwanevelder,在那里编码愉快:)

以上是关于ASP.Net Core 的自定义承载令牌授权的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core 2 验证承载令牌

带有取消令牌的自定义 ASP.NET Core 中间件

Jwt 和 ASP.NET CORE 授权 AspNetRoleClaims

向 ASP.NET Core 的 JWT 令牌添加自定义验证?

ASP.NET Core 和 JSON Web 令牌 - 自定义声明映射

ASP.NET Core 2.0 为同一端点结合了 Cookie 和承载授权