ASP.Net 核心的自定义不记名令牌授权
Custom Bearer Token Authorization for ASP.Net Core
这是自定义不记名令牌授权机制的可接受实现吗?
授权属性
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 class 用于 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 核心集成得很好,您还可以向令牌添加一些信息(用户名、角色等)。这样,您甚至不需要访问数据库进行验证(如果您愿意的话)。
此外,将密钥存储在 appsettings 文件中可能会导致意外地将它们添加到您的源代码管理器(安全)。您可以将用户机密用于本地开发(或在环境 = dev 时禁用密钥)和环境变量用于生产。
这是一个很好的例子,说明如何将 jwt 与 asp.net 一起使用:https://jonhilton.net/2017/10/11/secure-your-asp.net-core-2.0-api-part-1-issuing-a-jwt/
这是自定义不记名令牌授权机制的可接受实现吗?
授权属性
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 class 用于 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 核心集成得很好,您还可以向令牌添加一些信息(用户名、角色等)。这样,您甚至不需要访问数据库进行验证(如果您愿意的话)。
此外,将密钥存储在 appsettings 文件中可能会导致意外地将它们添加到您的源代码管理器(安全)。您可以将用户机密用于本地开发(或在环境 = dev 时禁用密钥)和环境变量用于生产。
这是一个很好的例子,说明如何将 jwt 与 asp.net 一起使用:https://jonhilton.net/2017/10/11/secure-your-asp.net-core-2.0-api-part-1-issuing-a-jwt/