[编程代码] .net core api JWT Token使用

4680 0
黑夜隐士 2021-12-13 08:09:52 | 显示全部楼层 |阅读模式

一、项目>管理Nuget包 安装

二、.appsettings.json添加

  1. <code>"JWT": {
  2. "Secret": "~!@#$%^&*()_+qwertyuiopasldkh[o51485421ajshk^%*)kasd", // 密钥
  3. "Issuer": "kfjdhf", // 颁发者
  4. "Audience": "kfjdhf", // 接收者
  5. //"Expired": 30 // 过期时间(30min)
  6. }
复制代码

三、ConfigureServices注入jwt

  1. <code> #region 注册JWT
  2. //获取配置文件
  3. var JWTConfig = Configuration.GetSection("JWT");
  4. //生成密钥
  5. var symmetricKeyAsBase64 = JWTConfig.GetValue<string>("Secret");
  6. var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64);
  7. var signingKey = new SymmetricSecurityKey(keyByteArray);
  8. //认证参数
  9. services.AddAuthentication("Bearer")
  10. .AddJwtBearer(o =>
  11. {
  12. o.TokenValidationParameters = new TokenValidationParameters
  13. {
  14. ValidateIssuerSigningKey = true,//是否验证签名,不验证的画可以篡改数据,不安全
  15. IssuerSigningKey = signingKey,//解密的密钥
  16. ValidateIssuer = true,//是否验证发行人,就是验证载荷中的Iss是否对应ValidIssuer参数
  17. ValidIssuer = JWTConfig.GetValue<string>("Iss"),//发行人
  18. ValidateAudience = true,//是否验证订阅人,就是验证载荷中的Aud是否对应ValidAudience参数
  19. ValidAudience = JWTConfig.GetValue<string>("Aud"),//订阅人
  20. ValidateLifetime = true,//是否验证过期时间,过期了就拒绝访问
  21. ClockSkew = TimeSpan.Zero,//这个是缓冲过期时间,也就是说,即使我们配置了过期时间,这里也要考虑进去,过期时间+缓冲,默认好像是7分钟,你可以直接设置为0
  22. RequireExpirationTime = true,
  23. };
  24. });
  25. #endregion
复制代码

(2).Configure启用

  1. <code>app.UseAuthentication();//jwt
复制代码

四、创建jwt帮助类

  1. <code>using Microsoft.Extensions.Configuration;
  2. using Microsoft.IdentityModel.Tokens;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IdentityModel.Tokens.Jwt;
  6. using System.Linq;
  7. using System.Security.Claims;
  8. using System.Text;
  9. namespace SystemAPi.JWT
  10. {
  11. public class JwtHelper
  12. {
  13. public JwtHelper(IConfiguration configuration)
  14. {
  15. Configuration = configuration;
  16. }
  17. /// <summary>
  18. /// 配置属性
  19. /// </summary>
  20. public IConfiguration Configuration { get; }
  21. /// <summary>
  22. /// 生成Token
  23. /// </summary>
  24. /// <returns></returns>
  25. public string GenerateToken(List<Claim> claims)
  26. {
  27. var jwtConfig = Configuration.GetSection("Jwt");
  28. //秘钥,就是标头,这里用Hmacsha256算法,需要256bit的密钥
  29. var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtConfig.GetValue<string>("Secret"))), SecurityAlgorithms.HmacSha256);
  30. //Claim,JwtRegisteredClaimNames中预定义了好多种默认的参数名,也可以像下面的Guid一样自己定义键名.
  31. //ClaimTypes也预定义了好多类型如role、email、name。Role用于赋予权限,不同的角色可以访问不同的接口
  32. //相当于有效载荷
  33. List<Claim> baseClaims = new List<Claim>{
  34. new Claim(JwtRegisteredClaimNames.Iss,jwtConfig.GetValue<string>("Issuer")),
  35. new Claim(JwtRegisteredClaimNames.Aud,jwtConfig.GetValue<string>("Audience")),
  36. new Claim("Guid",Guid.NewGuid().ToString("D")),
  37. new Claim(ClaimTypes.Role,"admin"),
  38. };
  39. claims = claims.Union<Claim>(baseClaims).ToList<Claim>();//合并Claim,删除重复项目
  40. SecurityToken securityToken = new JwtSecurityToken(
  41. signingCredentials: securityKey,
  42. expires: DateTime.Now.AddDays(1),//过期时间
  43. claims: claims
  44. );
  45. //生成jwt令牌
  46. return new JwtSecurityTokenHandler().WriteToken(securityToken);
  47. }
  48. }
  49. }
复制代码

五、测试登录成功把账户信息存进token

  1. <code> /// 登录
  2. /// </summary>
  3. /// <returns>登录</returns>
  4. [HttpGet]
  5. public ReturnJson login(string name, string pwd)
  6. {
  7. User data = bll.login(name, pwd);
  8. if (data!=null)
  9. {
  10. if (data.name == name && data.password == pwd)
  11. {
  12. List<Claim> claims = new List<Claim>() {
  13. new Claim(ClaimTypes.NameIdentifier, data.name),
  14. new Claim(ClaimTypes.Role,data.AdminId.ToString()),
  15. new Claim("AdminRole",data.AdminId.ToString())
  16. };
  17. string token=jwtHelper.GenerateToken(claims);
  18. return new ReturnJson<string>().Success(token);
  19. };
  20. }
  21. return new ReturnJson().Fail();
  22. }
复制代码


来源:https://blog.csdn.net/Lzysnd/article/details/121863725
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行