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

时间:2018-03-29 08:11:54

标签: c# asp.net-core bearer-token asp.net-authorization

这是自定义承载令牌授权机制的可接受实现吗?

授权属性

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

的appSettings

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

}

请求标题

Authorization: Bearer 372F78BC6B66F3CEAF705FE57A91F369A5BE956692A4DA7DE16CAD71113CF046

1 个答案:

答案 0 :(得分:0)

那行得通,但这是在重新发明轮子。

这几天我最好的方法是使用JWT,您可以在这里找到有关它的更多信息:http://www.jwt.io/

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

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

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