zoukankan      html  css  js  c++  java
  • JWT验证

    在.NET Core中想给API进行安全认证,现在最常用的就是Jwt了,简单记录下JWT的使用方法。

    一、首先在appsettings.json里写基本配置,参数如下

      "JwtSecurity": {
        "Issuer": "", // 颁发者
        "Audience": "", // 接收者
        "TokenExpires": 7200, // 过期时间,秒为单位
        "SecurityKey": "hello world" // 密钥  
      },
    

      

    二、在Setup里加入限制

                #region JWT验证
                var jwtSecurity = Configuration.GetSection("JwtSecurity");
                var key = jwtSecurity.GetValue<string>("SecurityKey");
                services.AddAuthentication(x =>
                {
                    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                    x.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                })
                .AddJwtBearer(x =>
                {
                    x.RequireHttpsMetadata = false;
                    x.SaveToken = true;
                    x.IncludeErrorDetails = true;
                    x.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuerSigningKey = true,
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)),
                        ValidateIssuer = false,
                        ValidateAudience = false,
                        ValidateLifetime = true,
                        RequireExpirationTime = true,
                        ClockSkew = TimeSpan.FromSeconds(0),
                    };
                    x.Events = new JwtBearerEvents()
                    {
                        OnChallenge = new Func<JwtBearerChallengeContext, System.Threading.Tasks.Task>(async target =>
                        {
                            target.HandleResponse();
                            target.Response.ContentType = "application/json";
                            target.Response.StatusCode = StatusCodes.Status401Unauthorized;
                            string result = Newtonsoft.Json.JsonConvert.SerializeObject(new { state = ResultType.TokenOver, message = "授权失败" });
                            await target.Response.WriteAsync(result);
                        }),
                    };
                });
                #endregion

    三、获取token

            async Task<object> GetToken(UserInfo user)
            {
                var tokenHandler = new JwtSecurityTokenHandler();
                var jwtSecurity = configuration.GetSection("JwtSecurity");
                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecurity.GetValue<string>("SecurityKey")));
                var nowTime = DateTime.Now;
                var tokenExpires = nowTime.Add(TimeSpan.FromSeconds(jwtSecurity.GetValue<int>("TokenExpires")));
    
                var identity = new
                ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
                identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()));
                identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName.ToString()));
    
                var tokenDescriptor = new SecurityTokenDescriptor
                {
                    Subject = identity,
                    Expires = tokenExpires,
                    SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
                };
                var token = tokenHandler.CreateToken(tokenDescriptor);
                return new
                {
                    Code = ResultType.Success,
                    Token = tokenHandler.WriteToken(token),
                    TokenExpireTime = tokenExpires,
                };
            }
    

     在用户登录的时候,调用上面这个方法就可以获取token了,前端请求接口的时候需要携带token。

  • 相关阅读:
    超酷的元素周期表
    TestLink在线Excel用例转换xml
    我也学习JAVA多线程-join
    request.getSession(true/false)的区别
    nginx location配置详细解释
    RestTemplate--解决中文乱码
    扇贝-每日一句
    Hexo博客系列(三)-将Hexo v3.x个人博客发布到GitLab Pages
    C程序的内存分区(节选自黑马训练营day1)
    CodeBlocks更换界面主题界面、汉化及去掉注释及字符串的下划线(汉化包的链接来自本站的BeatificDevin大神)
  • 原文地址:https://www.cnblogs.com/zhangjd/p/12552750.html
Copyright © 2011-2022 走看看