• 38-JWT 设计解析及定制


    可去官网下载Security项目查看源码

    只需修改 AddJwtBearer中的行为即可

      public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    
                services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
                var jwtSetting =  new JwtSettings();
                Configuration.Bind("JwtSettings",jwtSetting);
    
                services.AddAuthentication(options=>{
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                .AddJwtBearer(jwtOption=>{
                    // jwtOption.TokenValidationParameters=new Microsoft.IdentityModel.Tokens.TokenValidationParameters{
                    //     ValidIssuer = jwtSetting.Issure,
                    //     ValidAudience = jwtSetting.Audience,
                    //     IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(
                    //         System.Text.Encoding.UTF8.GetBytes(jwtSetting.SecretKey)
                    //     )
                    // };
                    jwtOption.SecurityTokenValidators.Clear();
                    jwtOption.SecurityTokenValidators.Add(new MyTokenValidator());
                    jwtOption.Events = new JwtBearerEvents(){
                        OnMessageReceived = Context=>{
                            var token = Context.Request.Headers["token"];
                            Context.Token = token;
                            return Task.CompletedTask;
                        }
                    };
    
                });
            }

    自定义验证类的实现,需实现ISecurityTokenValidator接口

    using System.Security.Claims;
    using Microsoft.IdentityModel.Tokens;
    using Microsoft.AspNetCore.Authentication.JwtBearer;
    
    namespace JwtAuthSample.Auth
    {
        public class MyTokenValidator : ISecurityTokenValidator
        {
         
            bool ISecurityTokenValidator.CanValidateToken => true;
            public int MaximumTokenSizeInBytes { get;set; }
    
    
            public bool CanReadToken(string securityToken)
            {
                return true;
            }
    
            public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
            {
                validatedToken = null;
                if(securityToken!="abcdefg"){
                    return new ClaimsPrincipal();;
                }
                var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
                identity.AddClaim(new Claim("name","qinzb"));
                identity.AddClaim(new Claim(ClaimsIdentity.DefaultRoleClaimType,"admin"));
                var prinipal = new ClaimsPrincipal(identity);
                return prinipal;
            }
        }
    }

    访问方式,如果token不对,则会返回401未授权

  • 相关阅读:
    elementui组件库eldialog弹出框被遮罩层挡住
    python常规基础操作
    python中的字典排序
    python列表面试题
    python logging日志模块
    python序列之列表
    jmeter中csv连接数据库
    python必会的知识基础
    jmeter tcp 压力测试
    python模块基础知识练习
  • 原文地址:https://www.cnblogs.com/qinzb/p/9363210.html
Copyright © 2020-2023  润新知