—NET CORE 3.1

NutGet包

  • Microsoft.AspNetCore.Authentication.JwtBearer
  • Swashbuckle.AspNetCore
  • Swashbuckle.AspNetCore.Filters

    Swagger●添加服务

    ConfigureServices中添加

    1. services.AddSwaggerGen(c =>
    2. {
    3. c.SwaggerDoc("V1", new OpenApiInfo
    4. {
    5. // {ApiName} 定义成全局变量,方便修改
    6. Version = "V1",
    7. Title = $"{ApiName} 接口文档——Netcore 3.1",
    8. Description = $"{ApiName} HTTP API V1",
    9. Contact = new OpenApiContact { Name = ApiName, Email = "你的邮箱", Url = new Uri("你的网址") },
    10. License = new OpenApiLicense { Name = ApiName, Url = new Uri("你的网址") }
    11. });
    12. c.OrderActionsBy(o => o.RelativePath);
    13. // 获取xml文件名
    14. var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    15. // 获取xml文件路径
    16. var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
    17. // 添加控制器层注释,true表示显示控制器注释
    18. //默认的第二个参数是false,这个是controller的注释,记得修改
    19. c.IncludeXmlComments(xmlPath, true);
    20. var xmlModelPath = Path.Combine(AppContext.BaseDirectory, "Model生成的文件名.xml");//这个就是Model层的xml文件名
    21. c.IncludeXmlComments(xmlModelPath);
    22. //开启加权小锁
    23. c.OperationFilter<AddResponseHeadersFilter>();
    24. c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
    25. //在Heder中添加Token 传递到后台
    26. c.OperationFilter<SecurityRequirementsOperationFilter>();
    27. c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
    28. {
    29. Description = "JWT授权(数据将在请求头中进行传输) 直接在下框中输入Bearer {token}(注意两者之间有一个空格)",
    30. Name = "Authorization",//jwt默认的参数名称,
    31. In = ParameterLocation.Header,//jwt默认存放Autorization信息的位置(header中)
    32. Type = SecuritySchemeType.ApiKey
    33. });
    34. });

    Swagger●配置中间件

    Configure中添加

    1. app.UseSwaggerUI(c =>
    2. {
    3. c.SwaggerEndpoint($"/swagger/V1/swagger.json", $"{ApiName} V1");
    4. //路径配置,设置为空,表示直接在根域名(localhost:8001)访问该文件,注意localhost:8001/swagger是访问不到的,去launchSettings.json把launchUrl去掉,如果你想换一个路径,直接写名字即可,比如直接写c.RoutePrefix = "doc";
    5. c.RoutePrefix = "";
    6. });

    JWT●添加服务

    ConfigureServices中添加

    1. services.AddAuthentication("Bearer").AddJwtBearer(o => {
    2. o.TokenValidationParameters = new TokenValidationParameters
    3. {
    4. ValidateIssuerSigningKey = true,
    5. IssuerSigningKey = “秘钥”,
    6. ValidateIssuer = true,
    7. ValidIssuer = “”,//发行人
    8. ValidateAudience = true,
    9. ValidAudience = “”,//订阅人
    10. ValidateLifetime = true,
    11. ClockSkew = TimeSpan.Zero,//这个是缓冲过期时间,也就是说,即使我们配置了过期时间,这里也要考虑进去,过期时间+缓冲,默认好像是7分钟,你可以直接设置为0
    12. RequireExpirationTime = true,
    13. };
    14. o.Events = new JwtBearerEvents {
    15. OnAuthenticationFailed = context => {
    16. // 如果过期,则把<是否过期>添加到,返回头信息中
    17. if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
    18. {
    19. context.Response.Headers.Add("Token-Expired", "true");
    20. }
    21. return Task.CompletedTask;
    22. }
    23. };
    24. });

    JWT●配置中间件

    Configure中添加

    1. //先开启认证
    2. app.UseAuthentication();
    3. //授权中间件
    4. app.UseAuthorization();

    JWTHelper

    封装一个JWThelper 用于生成token ```csharp public class JWTHelper {

    1. public class JwtHelper
    2. {
    3. /// <summary>
    4. /// 颁发JWT字符串
    5. /// </summary>
    6. /// <param name="tokenModel"></param>
    7. /// <returns></returns>
    8. public static string IssueJwt(TokenModelJwt tokenModel)
    9. {
    10. // 自己封装的 appsettign.json 操作类,看下文
    11. string iss = Appsettings.app(new string[] { "Audience", "Issuer" });
    12. string aud = Appsettings.app(new string[] { "Audience", "Audience" });
    13. string secret = Appsettings.app(new string[] { "Audience", "Secret" });
    14. var claims = new List<Claim>
    15. {
    16. /*
    17. * 特别重要:
    18. 1、这里将用户的部分信息,比如 uid 存到了Claim 中,如果你想知道如何在其他地方将这个 uid从 Token 中取出来,请看下边的SerializeJwt() 方法,或者在整个解决方案,搜索这个方法,看哪里使用了!
    19. 2、你也可以研究下 HttpContext.User.Claims ,具体的你可以看看 Policys/PermissionHandler.cs 类中是如何使用的。
    20. */
    21. new Claim(JwtRegisteredClaimNames.Jti, tokenModel.Uid.ToString()),
    22. new Claim(JwtRegisteredClaimNames.Iat, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
    23. new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
    24. //这个就是过期时间,目前是过期7200秒,可自定义,注意JWT有自己的缓冲过期时间
    25. new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddSeconds(7200)).ToUnixTimeSeconds()}"),
    26. new Claim(JwtRegisteredClaimNames.Iss,iss),
    27. new Claim(JwtRegisteredClaimNames.Aud,aud),
    28. //new Claim(ClaimTypes.Role,tokenModel.Role),//为了解决一个用户多个角色(比如:Admin,System),用下边的方法
    29. };
    30. // 可以将一个用户的多个角色全部赋予;
    31. // 作者:DX 提供技术支持;
    32. claims.AddRange(tokenModel.Role.Split(',').Select(s => new Claim(ClaimTypes.Role, s)));
  1. //秘钥 (SymmetricSecurityKey 对安全性的要求,密钥的长度太短会报出异常)
  2. var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
  3. var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  4. var jwt = new JwtSecurityToken(
  5. issuer: iss,
  6. claims: claims,
  7. signingCredentials: creds
  8. //,expires:DateTime.Now.AddMinutes(1)
  9. );
  10. var jwtHandler = new JwtSecurityTokenHandler();
  11. var encodedJwt = jwtHandler.WriteToken(jwt);
  12. return encodedJwt;
  13. }
  14. /// <summary>
  15. /// 解析
  16. /// </summary>
  17. /// <param name="jwtStr"></param>
  18. /// <returns></returns>
  19. public static TokenModelJwt SerializeJwt(string jwtStr)
  20. {
  21. var jwtHandler = new JwtSecurityTokenHandler();
  22. JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(jwtStr);
  23. object role;
  24. try
  25. {
  26. jwtToken.Payload.TryGetValue(ClaimTypes.Role, out role);
  27. }
  28. catch (Exception e)
  29. {
  30. Console.WriteLine(e);
  31. throw;
  32. }
  33. var tm = new TokenModelJwt
  34. {
  35. Uid = (jwtToken.Id).ObjToInt(),
  36. Role = role != null ? role.ObjToString() : "",
  37. };
  38. return tm;
  39. }
  40. }
  41. /// <summary>
  42. /// 令牌
  43. /// </summary>
  44. public class TokenModelJwt
  45. {
  46. /// <summary>
  47. /// Id
  48. /// </summary>
  49. public long Uid { get; set; }
  50. /// <summary>
  51. /// 角色
  52. /// </summary>
  53. public string Role { get; set; }
  54. /// <summary>
  55. /// 职能
  56. /// </summary>
  57. public string Work { get; set; }
  58. }
  59. }
  1. Controller中可以测试
  2. ```csharp
  3. TokenModelJwt tokenModel = new TokenModelJwt { Uid = 1, Role = userRole };
  4. jwtStr = JwtHelper.IssueJwt(tokenModel);//登录,获取到一定规则的 Token 令牌

Asp.Net Core3.1-集成Swagger JWT - 图1