翼度科技»论坛 编程开发 .net 查看内容

02_Web Api使用Jwt

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
JWT(JSON Web Token)是一种用于在网络应用之间传递信息的开放标准(RFC 7519)。它使用 JSON 对象在安全可靠的方式下传递信息,通常用于身份验证和信息交换。
在Web API中,JWT通常用于对用户进行身份验证和授权。当用户登录成功后,服务器会生成一个Token并返回给客户端,客户端在接下来的请求中携带该Token来进行身份验证。
使用:
安装包:JWT
1.添加一个Web Api项目
appsettings.json设置
  1. "JWT": {
  2.     "SecretKey": "123456789ffffffffffffffffffffffffffffffffffff", //私钥
  3.     "Issuer": "zhansan", //发布者
  4.     "Audience": "lisi" //接收者
  5.   }
复制代码
 
2.添加一个控制器用于获取Token
  1.     [Route("api/[controller]/[action]")]
  2.     [ApiController]
  3.     public class TokenController : ControllerBase
  4.     {
  5.         public readonly IConfiguration configuration;
  6.         public TokenController(IConfiguration configuration)
  7.         {
  8.             this.configuration = configuration;
  9.         }
  10.         [HttpGet]
  11.         public string GetToken()
  12.         {//HmacSha256算法
  13.             var signingAlogorithm = SecurityAlgorithms.HmacSha256;
  14.             //存放用户信息
  15.             var claims = new[]
  16.             {
  17.                 new Claim(JwtRegisteredClaimNames.Sub,"userId"),
  18.                 new Claim(ClaimTypes.Role,"admin"),
  19.                 new Claim(ClaimTypes.Name,"ClaimTypesName"),new Claim("policy","EmployeeNumber"),
  20.             };//取出私钥并以utf8编码字节输出
  21.             var secretByte = Encoding.UTF8.GetBytes(configuration["JWT:SecretKey"]);
  22.             //使用非对称算法对私钥进行加密
  23.             var signingKey = new SymmetricSecurityKey(secretByte);
  24.             //使用HmacSha256来验证加密后的私钥生成数字签名
  25.             var signingCredentials = new SigningCredentials(signingKey, signingAlogorithm);
  26.             //生成Token
  27.             var Token = new JwtSecurityToken(
  28.                     issuer: configuration["JWT:Issuer"],        //发布者
  29.                     audience: configuration["JWT:Audience"],    //接收者
  30.                     claims: claims,                             //存放的用户信息
  31.                     notBefore: DateTime.UtcNow,                 //发布时间
  32.                     expires: DateTime.UtcNow.AddDays(1),        //有效期设置为1天
  33.                     signingCredentials                           //数字签名
  34.                 );
  35.             //生成字符串token
  36.             var _Tokenstring = new JwtSecurityTokenHandler().WriteToken(Token);
  37.             return _Tokenstring;
  38.         }
  39.     }
复制代码
 
3.Program.cs设置
  1. public class Program
  2.     {
  3.         public static void Main(string[] args)
  4.         {
  5.             var builder = WebApplication.CreateBuilder(args);
  6.             // Add services to the container.
  7.             builder.Services.AddControllers();
  8.             // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  9.             builder.Services.AddEndpointsApiExplorer();
  10.             builder.Services.AddSwaggerGen(c =>
  11.             {
  12.                 //版本控制
  13.                 foreach (FieldInfo field in typeof(EditionV).GetFields())
  14.                 {
  15.                     c.SwaggerDoc(field.Name, new OpenApiInfo()
  16.                     {
  17.                         Title = field.Name + "版本",
  18.                         Version = field.Name,
  19.                         Description = $"{field.Name}版本"
  20.                     });
  21.                 }
  22.                 //为swagger UI设置xml文档注释路径
  23.                 var file = Path.Combine(AppContext.BaseDirectory, "WebApiApp.xml");  // xml文档绝对路径
  24.                 var path = Path.Combine(AppContext.BaseDirectory, file); // xml文档绝对路径
  25.                 c.IncludeXmlComments(path, true); // true : 显示控制器层注释
  26.                 c.OrderActionsBy(o => o.RelativePath); // 对action的名称进行排序,如果有多个,就可以看见效果了。
  27.                 //注册到swagger中
  28.                 c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
  29.                 {
  30.                     Description = "Value: Bearer {token}",
  31.                     Name = "Authorization",
  32.                     In = ParameterLocation.Header,
  33.                     Type = SecuritySchemeType.ApiKey,
  34.                     Scheme = "Bearer"
  35.                 });
  36.                 c.AddSecurityRequirement(new OpenApiSecurityRequirement()
  37.                 {{
  38.                     new OpenApiSecurityScheme
  39.                     {
  40.                         Reference = new OpenApiReference
  41.                         {
  42.                             Type = ReferenceType.SecurityScheme,
  43.                             Id = "Bearer"
  44.                         }, Scheme = "oauth2", Name = "Bearer", In = ParameterLocation.Header }, new List<string>()
  45.                     }
  46.                 });
  47.             });<br>
  48.             //策略授权
  49.             builder.Services.AddAuthorization(options =>
  50.             {
  51.                 options.AddPolicy("policy", policy => policy.RequireClaim("policy"));
  52.             });
  53.             //身份认证--如何鉴权
  54.             builder.Services.AddAuthentication(options =>
  55.             {
  56.                 //options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
  57.                 options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  58.                 options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  59.             })
  60.             .AddJwtBearer(options =>
  61.             {
  62.                 //取出私钥
  63.                 var secretByte = Encoding.UTF8.GetBytes(builder.Configuration["JWT:SecretKey"]);
  64.                 options.TokenValidationParameters = new TokenValidationParameters()
  65.                 {
  66.                     //验证发布者
  67.                     ValidateIssuer = true,
  68.                     ValidIssuer = builder.Configuration["JWT:Issuer"],
  69.                     //验证接收者
  70.                     ValidateAudience = true,
  71.                     ValidAudience = builder.Configuration["JWT:Audience"],
  72.                     //ValidateIssuerSigningKey= true,//是否验证SigningKey
  73.                     //验证是否过期
  74.                     ValidateLifetime = true,
  75.                     //验证私钥
  76.                     IssuerSigningKey = new SymmetricSecurityKey(secretByte)
  77.                 };
  78.             });
  79.             //配置跨域服务
  80.             builder.Services.AddCors(options =>
  81.             {
  82.                 options.AddPolicy("cross", p =>
  83.                 {
  84.                     p.AllowAnyOrigin()
  85.                     .AllowAnyMethod()
  86.                     .AllowAnyHeader();
  87.                 });
  88.             });
  89.             var app = builder.Build();
  90.             // Configure the HTTP request pipeline.
  91.             if (app.Environment.IsDevelopment())
  92.             {
  93.                 app.UseSwagger();
  94.                 app.UseSwaggerUI(c =>
  95.                 {
  96.                     foreach (FieldInfo field in typeof(EditionV).GetFields())
  97.                     {
  98.                         c.SwaggerEndpoint($"/swagger/{field.Name}/swagger.json", $"{field.Name}");
  99.                     }
  100.                 });
  101.             }
  102.             app.UseCors("cross");  //跨域
  103.             app.UseHttpsRedirection();
  104.             app.UseAuthentication(); //鉴权
  105.             app.UseAuthorization();//授权
  106.             app.MapControllers();
  107.             app.Run();
  108.         }
  109.     }
复制代码
 
4.swagger设置
  1.     /// <summary>
  2.     /// 版本
  3.     /// </summary>
  4.     public static class EditionV
  5.     {
  6.         public static string V1;
  7.         public static string V2;
  8.         public static string V3;
  9.         public static string V4;
  10.         public static string V5;
  11.     }
复制代码
添加一个WebApiApp.xml文件,属性:复制到输出目录:始终复制
项目--->属性--->文档文件勾上。

 
5.添加一个UserInfoController.cs用于测试
  1.     [Route("api/[controller]/[action]")]
  2.     [ApiController]
  3.     [ApiExplorerSettings(GroupName =nameof(EditionV.V1))]
  4.     public class UserInfoController : ControllerBase
  5.     {
  6.         /// <summary>
  7.         /// 获取用户
  8.         /// </summary>
  9.         /// <param name="id"></param>
  10.         /// <returns></returns>
  11.         [HttpGet]
  12.         [Authorize]
  13.         public string GetUser(string id)
  14.         {
  15.             return $"用户id{id}---姓名:张三";
  16.         }
  17.         /// <summary>
  18.         /// 获取用户名
  19.         /// </summary>
  20.         /// <returns></returns>
  21.         [Authorize(Roles = "admin")]
  22.         [HttpPost]
  23.         public string GetUserName()
  24.         {
  25.             return "你好,我是李四";
  26.         }<br>/// <summary>
  27.         /// 获取用户颜色
  28.         /// </summary>
  29.         /// <returns></returns>
  30.         [Authorize(Policy = "policy")]
  31.         [HttpPost]
  32.         public string GetUserColour()
  33.         {
  34.             return "我衣服的颜色为红色";
  35.         }
  36.     }
复制代码
 

来源:https://www.cnblogs.com/MingQiu/p/18132547
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具