zoukankan      html  css  js  c++  java
  • 基于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授权验证。

      

  • 相关阅读:
    Atcoder D
    51nod 1201 整数划分(dp)
    Atcoder D
    Atcoder C
    codeforces 812 E. Sagheer and Apple Tree(树+尼姆博弈)
    codeforces 811 D. Vladik and Favorite Game(bfs水题)
    codeforces 811 E. Vladik and Entertaining Flags(线段树+并查集)
    codeforces 811 C. Vladik and Memorable Trip(dp)
    1449 砝码称重(思维)
    SQL大量数据查询的优化 及 非用like不可时的处理方案
  • 原文地址:https://www.cnblogs.com/zhangmingjian/p/14089853.html
Copyright © 2011-2022 走看看