基于IAuthenticationHandler接口实现最简单的自定义授权验证器
对于一个简单的api服务有时候不需要复杂的认证逻辑,只要验证header中的token值是否合法就认证通过,这时引用第三方认证组件未免太重了,所以验证的逻辑自己实现IAuthenticationHandler接口即可,针对这个接口微软已经定义好了基类 AuthenticationHandler<TOptions>,一系列的相关数据HttpContext、HttpRequest、Logger等参数都帮我们定义好了,我们只需要实现其中的抽象方法:HandleAuthenticateAsync()就行了。我的DefaultAuthorizeHandler验证器主要实现逻辑:
public class DefaultAuthorizeHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
public const string SchemeName = "WebTokenAuth";
public DefaultAuthorizeHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
: base(options, logger, encoder, clock)
{
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
await Task.CompletedTask;
var token = Request.Headers["token"];
//验证token合法性
//验证通过 return AuthenticateResult.Success(ticket);
//验证失败 return AuthenticateResult.Fail(new AuthenticationException(message));
}
还需在Startup启动配置内注入DefaultAuthorizeHandler类:
// ConfigureServices 方法内的配置
services.AddAuthentication(options => //添加认证处理器
{
//options.DefaultScheme = DefaultAuthHandler.SchemeName;//不要指定默认授权方案,否则所有请求都会进行验证
options.AddScheme<DefaultAuthorizeHandler>(DefaultAuthorizeHandler.SchemeName, DefaultAuthorizeHandler.SchemeName);
});
//Configure方法添加上认证、授权两个中间件
app.UseAuthentication(); //认证
app.UseAuthorization(); //授权
在控制器中使用授权认证处理器:
public class HomeController : ControllerBase
{
//指定的AuthenticationSchemes名一定要与注入时AddScheme指定的SchemeName一致,不然是找不到认证处理器的
[Authorize(AuthenticationSchemes = DefaultAuthorizeHandler.SchemeName)]
public ActionResult Index()
{
return Ok();
}
}
这样三步就实现了一个最简单的token授权验证。

浙公网安备 33010602011771号