基于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授权验证。

  

posted @ 2020-12-05 15:31  mingjian_zhang  阅读(2457)  评论(1编辑  收藏  举报