對於一個簡單的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授權驗證。