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