基於IAuthenticationHandler介面實現最簡單的自定義授權驗證器
阿新 • • 發佈:2020-12-05
對於一個簡單的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授權驗證。