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

API身份认证JWT

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
JWT简介

是一种身份认证的开放标准(RFC 7519),可以在网络应用间传输信息作为Json对象。由三部分组成:头部(Header)、载荷(payload)和签名(Signature).
头部(Header)

两部分组成,令牌类型和所使用的的签名算法
  1. {
  2. "alg":"HS256",
  3. "typ":"JWT"
  4. }
复制代码
 
载荷(payload)

包含要传输的信息,包括用户的身份信息、权限等。载荷可以自定义,但需要避免包含敏感信息。
  1. {
  2. "sub":"1234567890",
  3. "name":"zuozuo",
  4. "iat":17773219179
  5. }
复制代码
 
签名(Signature)

用于验证令牌的完整性和真实性,通常通过使用头部和载荷中的数据以及一个密钥进行加密生成
  1. HMACSHA256(
  2. base64UrlEncode(header)+"."+
  3. base64UrlEncode(payload),
  4. secret
  5. )
复制代码
 
JWT的工作流程


  • 用户提供用户名和密码进行身份认证
  • 服务器验证用户和密码的正确性
  • 服务器使用私钥签发JWT,并将其发送给客户端
  • 客户端将JWT存储到本地,例如在浏览器的localstorage中。
  • 客户端在后续的请求中使用JWT进行身份认证,将其放在请求的头部或其他位置
  • 服务器接收到请求后,使用公钥验证JWT的合法性和完整性。
  • 如果JWT通过验证,服务器可以根据载荷中的信息进行授权和权限验证。



    • JWT的有点包括不需要在服务器端存储会话信息,可扩展性好、跨语言和跨平台支持等。由于JWT是基于对称或非对称加密的,因此需要妥善保管密钥,以防止令牌被篡改。



  • Asp.Net Core中使用Microsoft.AspNetCore.Authentication.JwtBearer包
  • 配置身份认证服务



    • 在Startup.cs文件的ConfigureServices中添加代码,以配置JWT身份认证服务


  1. builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  2.     .AddJwtBearer(options =>
  3.     {
  4.         options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
  5.         {
  6.             ValidateIssuer = true,
  7.             ValidateAudience = true,
  8.             ValidateLifetime = true,
  9.             ValidateIssuerSigningKey = true,
  10.             ValidIssuer = "NetCoreDemo",
  11.             ValidAudience = "Test",
  12.             IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("!Qq123456Test*"))
  13.         };
  14.     });
复制代码
 
  1. app.UseAuthentication();
  2. app.UseAuthorization();
复制代码
 

  • 控制器使用身份认证,需要进行身份认证的控制器或者操作方法上添加[Authorize]标签
  • 生成JWT



    • 在用户登录成功后,可以使用System,IdentityModel.Tokens.Jwt包来生成JWT,

  1. [HttpPost]
  2.         public IActionResult Login(string username, string password)
  3.         {
  4.             if (username == "admin" && password == "admin")
  5.             {
  6.                 var tokenHandler = new JwtSecurityTokenHandler();
  7.                 var key = Encoding.UTF8.GetBytes("!Qq123456Test*dsadsadsadsadsa");//密钥
  8.                 var tokenDescriptor = new SecurityTokenDescriptor
  9.                 {
  10.                     Subject = new System.Security.Claims.ClaimsIdentity(
  11.                         new Claim[] {
  12.                             new Claim(ClaimTypes.Name, username)
  13.                         }),
  14.                     Expires = DateTime.UtcNow.AddHours(1),
  15.                     SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
  16.                 };
  17.                 var token = tokenHandler.CreateToken(tokenDescriptor);
  18.                 var tokenString = tokenHandler.WriteToken(token);
  19.                 return Ok(new { Token = tokenString });
  20.             }
复制代码
 

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

举报 回复 使用道具