基於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授權驗證。

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章