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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM