基于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授权验证。