JWT

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: nuget安装`Microsoft.AspNetCore.Authentication.JwtBearer`

JWT

模拟用户登陆

  1. nuget安装Microsoft.AspNetCore.Authentication.JwtBearer

[HttpPost("login")]

[AllowAnonymous] //不用登陆就可以访问,因为是登陆页

publicIActionResultlogin([FromBody] LoginDtologinDto)

{

   //1验证用户名密码

     ...

   //2创建JWT

   //2.1header

   varsigningAlgorithm=SecurityAlgorithms.HmacSha256;//定义算法

                                                        //2.2payload

   varclaims=new[] {

       //sub用户id

       newClaim(JwtRegisteredClaimNames.Sub,"fake_user_id"),

       };  

   //2.3signiture

   varsecretByte=Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);//将私钥转换成UTF8的字节形式

   varsigningKey=newSymmetricSecurityKey(secretByte); //先使用非对称算法对私钥进行加密

   varsigningCredentials=newSigningCredentials(signingKey, signingAlgorithm);//再使用HmacSha256来加密一下非对称加密后的私钥

   vartoken=newJwtSecurityToken(

       issuer: _configuration["Authentication:Issuer"], //谁发布的token

       audience: _configuration["Authentication:Audience"], //token发布给谁

       claims,

       notBefore: DateTime.UtcNow,//发布时间

       expires: DateTime.UtcNow.AddDays(1),//有效期,1天有效

       signingCredentials//数字签名

       );

   vartokenStr=newJwtSecurityTokenHandler().WriteToken(token);//将token转换成字符串

   //3返回jwt

   returnOk(tokenStr);

}

  1. 启用授权
  1. program

//注册身份认证服务。参数,默认身份认证类型

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

   .AddJwtBearer(opt=>//配置jwt认证

   {

       varsecretByte=Encoding.UTF8.GetBytes(builder.Configuration["Authentication:SecretKey"]);

       opt.TokenValidationParameters=newTokenValidationParameters()

       {

           ValidateIssuer=true,//验证发布者

           ValidIssuer=builder.Configuration["Authentication:Issuer"],

           ValidateAudience=true,//验证持有者

           ValidAudience=builder.Configuration["Authentication:Audience"],

           ValidateLifetime=true,//验证是否过期

           //将私钥从配置传入进来进行非对称加密

           IssuerSigningKey=newSymmetricSecurityKey(secretByte)

       };

   });

...

app.UseAuthentication();

app.UseAuthorization();

app.Run();

  1. 在需要授权的操作方法上增加[Authorize]

用户角色权限

claim

  • 表述用户的身份,说明用户的角色、表示用户所具有的的权限
  • 最小不可分割的单位,使用的灵活度高,可以自由组合
  1. 创建角色

varclaims=new[] {

               //sub用户id

               newClaim(JwtRegisteredClaimNames.Sub,"fake_user_id"),

               newClaim(ClaimTypes.Role,"Admin")//添加管理员角色

           };

  1. 启用授权在需要管理员授权的操作方法上增加[Authorize(Roles ="Admin")]

用户模型与数据库

  1. nuget安装Microsoft.AspNetCore.Identity.EntityFrameworkCore
  2. Program中增加builder.Services.AddIdentity<IdentityUser,IdentityRole>().AddEntityFrameworkStores<AppDbContext>();
  3. 数据库context继承IdentityDbContext,public class AppDbContext:IdentityDbContext<IdentityUser>

用户登陆

privatereadonlyIConfiguration_configuration;

privatereadonlyUserManager<IdentityUser>_userManager;

privatereadonlySignInManager<IdentityUser>_signInManager;

publicAuthenticateController(IConfigurationconfiguration, UserManager<IdentityUser>userManager, SignInManager<IdentityUser>signInManager)

{ _configuration=configuration;

   _userManager=userManager;

   _signInManager=signInManager;

}

[HttpPost("login")]

[AllowAnonymous]

publicasyncTask<IActionResult>login([FromBody] LoginDtologinDto)

{

   //1验证用户名密码

   varloginResult=await_signInManager.PasswordSignInAsync(

           loginDto.Email,

           loginDto.Password,

           false,

           false

       );

   if (!loginResult.Succeeded)

   {

       returnBadRequest();

   }

   varuser=await_userManager.FindByNameAsync(loginDto.Email);

   varroleNames=await_userManager.GetRolesAsync(user);

   //2创建JWT

   //2.1header

   varsigningAlgorithm=SecurityAlgorithms.HmacSha256;//定义算法

                                                        //2.2payload

   varclaims=newList<Claim> {

       //sub用户id

       newClaim(JwtRegisteredClaimNames.Sub,user.Id),

   };

   foreach (varroleNameinroleNames)

   {

       varroleClaim=newClaim(ClaimTypes.Role, roleName);

       claims.Add(roleClaim);

   }

   //2.3signiture

   varsecretByte=Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);//将私钥转换成UTF8的字节形式

   varsigningKey=newSymmetricSecurityKey(secretByte); //先使用非对称算法对私钥进行加密

   varsigningCredentials=newSigningCredentials(signingKey, signingAlgorithm);//再使用HmacSha256来验证一下非对称加密后的私钥

   vartoken=newJwtSecurityToken(

       issuer: _configuration["Authentication:Issuer"], //谁发布的token

       audience: _configuration["Authentication:Audience"], //token发布给谁

       claims,

       notBefore: DateTime.UtcNow,//发布时间

       expires: DateTime.UtcNow.AddDays(1),//有效期,1天有效

       signingCredentials//数字签名

       );

   vartokenStr=newJwtSecurityTokenHandler().WriteToken(token);//将token转换成字符串

   //3返回jwt

   returnOk(tokenStr);

}

 

  1. 操作方法增加[Authorize(AuthenticationSchemes ="Bearer")]  //identity多角色验证时必须指定

定制用户模型并添加初始化用户数据

  1. 自定义类

publicclassApplictionUser:IdentityUser

{

   publicstring?Address { set; get; }

   publicvirtualICollection<IdentityUserRole<string>>UserRoles { get; set; }

}

 

  1. 在context中

// 初始化用户与角色的种子数据

// 1. 更新用户与角色的外键关系

modelBuilder.Entity<ApplictionUser>(b=> {

   b.HasMany(x=>x.UserRoles)

   .WithOne()

   .HasForeignKey(ur=>ur.UserId)

   .IsRequired();

});

// 2. 添加角色

varadminRoleId="308660dc-ae51-480f-824d-7dca6714c3e2"; // guid

modelBuilder.Entity<IdentityRole>().HasData(

   newIdentityRole

   {

       Id=adminRoleId,

       Name="Admin",

       NormalizedName="Admin".ToUpper()

   }

);

// 3. 添加用户

varadminUserId="90184155-dee0-40c9-bb1e-b5ed07afc04e";

ApplictionUseradminUser=newApplictionUser

{

   Id=adminUserId,

   UserName="admin@fakexiecheng.com",

   NormalizedUserName="admin@fakexiecheng.com".ToUpper(),

   Email="admin@fakexiecheng.com",

   NormalizedEmail="admin@fakexiecheng.com".ToUpper(),

   TwoFactorEnabled=false,

   EmailConfirmed=true,

   PhoneNumber="123456789",

   PhoneNumberConfirmed=false

};

PasswordHasher<ApplictionUser>ph=newPasswordHasher<ApplictionUser>();

adminUser.PasswordHash=ph.HashPassword(adminUser, "Fake123$");

modelBuilder.Entity<ApplictionUser>().HasData(adminUser);

// 4. 给用户加入管理员权限

// 通过使用 linking table:IdentityUserRole

modelBuilder.Entity<IdentityUserRole<string>>()

   .HasData(newIdentityUserRole<string>()

   {

       RoleId=adminRoleId,

       UserId=adminUserId

   });


相关文章
|
6月前
|
存储 JSON 安全
JWT 还能这样的去理解嘛??
JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。从 JWT 的全称可以看出,JWT 本身也是 Token,一种规范化之后的。JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。可以看出,。并且, 使用 JWT 认证可以攻击,因为 JWT 一般是存在在中,使用 JWT 进行身份验证的过程中是的。
211 1
|
4月前
|
存储 JSON 算法
JWT
【7月更文挑战第5天】
37 0
|
5月前
|
存储 JSON 算法
12.Jwt
12.Jwt
30 0
|
12月前
|
前端开发
什么是JWT?深入理解JWT从原理到应用(下)
什么是JWT?深入理解JWT从原理到应用(下)
103 0
|
6月前
|
JSON 算法 数据库
JWT 是什么
JWT 是什么
|
6月前
|
存储 JSON 算法
什么是JWT?
什么是JWT?
66 0
|
6月前
|
存储 JSON 算法
快速了解什么是jwt及如何使用jwt
快速了解什么是jwt及如何使用jwt
173 0
|
11月前
|
存储 JSON 安全
了解什么是JWT
了解什么是JWT
60 0
|
11月前
|
JSON 数据格式
jwt->jwt简介,jwt工具类,jwt集进成spa项目
jwt->jwt简介,jwt工具类,jwt集进成spa项目
79 0
|
12月前
|
JSON 算法 前端开发
什么是JWT?深入理解JWT从原理到应用(上)
什么是JWT?深入理解JWT从原理到应用(上)
1658 0