c# - ASP.Net Core 的自定义不记名 token 授权

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

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

授权属性

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"

请求 header

Authorization: Bearer 372F78BC6B66F3CEAF705FE57A91F369A5BE956692A4DA7DE16CAD71113CF046

最佳答案

这会奏效,但有点像重新发明轮子。

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

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

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

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

关于c# - ASP.Net Core 的自定义不记名 token 授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49551047/

相关文章:

c# - 从 ExpressionTrees 获取值

c# - asp.net中如何显示消息框

c# - 从 WCF 数据服务客户端获取单个记录的最佳实践

c# - 无法使用 autofac 解决通用存储库的依赖关系

rest - Yii2 REST api 承载认证

c# - 如何序列化包含结构列表的类的对象列表

c# - Net Core : Execute All Dependency Injection in Xunit Test for AppService, 存储库等

asp.net-core - 当前不会命中切换断点。断点已设置但尚未绑定(bind)

api - 当 token 过期或 token 未通过 Asp.net core 2 时,获取 404 错误而不是 401

asp.net 身份不记名 token 在 20 分钟后过期