对于“.Net Core实现JWT授权认证”的完整攻略,我可以提供以下内容。
1. 什么是JWT授权认证
JWT(JSON Web Token)是一种轻量级且具有自包含能力的身份验证和授权协议。它基于 JSON 格式来定义一个安全、紧凑的、自包含的方式俩定义要传递的信息,通常用于验证、授权和信息交换。
2. JWT授权认证的优缺点
2.1 优点
- 大大减少了网络消耗,状态由客户端记忆
- 可以在多个应用中共享用户凭证
- 可以避免 CSRF 攻击和窃听
- Token 可以是服务器缓存,提升查询效率
- 能够自动刷新凭证,重新获取Token
2.2 缺点
- Token 存储不安全(可以使用其他方式解决)
- Token 不易消除
- Token被劫持后容易产生较大风险
3. 实现思路
JWT 授权认证实现步骤如下:
- 创建 JWT
- 把 JWT 发送到客户端
- 客户端将 JWT 存储在本地
- 客户端每次请求时,都带上存储的 JWT
- 服务器验证 JWT 是否合法,若合法,就接受请求,否则拒绝请求
4. 实现步骤
下面给出四个步骤来实现 JWT 授权认证。
4.1 添加依赖包
在 .Net Core 中实现 JWT 授权认证,需要添加 System.IdentityModel.Tokens.Jwt
和 Microsoft.AspNetCore.Authentication.JwtBearer
两个依赖包。通过以下命令行实现:
dotnet add package System.IdentityModel.Tokens.Jwt
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
4.2 添加服务
在 Startup.cs
文件的 ConfigureServices()
方法中添加以下步骤:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters {
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
};
});
4.3 添加授权
在 ConfigureServices()
方法中,添加授权:
services.AddAuthorization(options => {
options.AddPolicy("JwtAuth", policy => {
policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser();
});
});
4.4 生成 JWT
private string GenerateJwtToken(User user, string jwtKey, string jwtIssuer, string jwtAudience, int jwtExpireDays) {
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[] {
new Claim(JwtRegisteredClaimNames.Sub, user.Email),
new Claim(JwtRegisteredClaimNames.Email, user.Email),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(
issuer: jwtIssuer,
audience: jwtAudience,
claims: claims,
expires: DateTime.UtcNow.AddDays(jwtExpireDays),
signingCredentials: credentials
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
以上是实现 JWT 授权认证的大部分步骤,可以根据实际情况进行调整。
5. 示例说明
下面举两个示例说明如何使用 JWT 授权认证。
5.1 用户注册
用户在注册时,需要将注册信息发送到服务端,服务端对用户信息进行验证,验证通过则生成 JWT Token,并返回给客户端。客户端以后的每次请求均携带该 Token。
[HttpPost("Register")]
public async Task<IActionResult> Register(User user) {
if (!ModelState.IsValid) {
return BadRequest(ModelState);
}
var hashedPassword = HashPassword(user.Password);
user.Password = hashedPassword;
await _context.Users.AddAsync(user);
await _context.SaveChangesAsync();
var jwtToken = GenerateJwtToken(user, Configuration["Jwt:Key"], Configuration["Jwt:Issuer"], Configuration["Jwt:Audience"], int.Parse(Configuration["Jwt:ExpireDays"]));
return Ok(new { Token = jwtToken });
}
5.2 用户登录
用户登录成功后,提交用户登录信息到服务端,服务端对用户信息进行验证,若用户验证通过,则生成 JWT Token,并返回给客户端。客户端以后的每次请求均携带该 Token。
[HttpPost("Login")]
public async Task<IActionResult> Login(User user) {
if (!ModelState.IsValid) {
return BadRequest(ModelState);
}
var hashedPassword = HashPassword(user.Password);
var dbUser = await _context.Users.SingleOrDefaultAsync(u => u.Email == user.Email && u.Password == hashedPassword);
if (dbUser == null) {
return Unauthorized();
}
var jwtToken = GenerateJwtToken(dbUser, Configuration["Jwt:Key"], Configuration["Jwt:Issuer"], Configuration["Jwt:Audience"], int.Parse(Configuration["Jwt:ExpireDays"]));
return Ok(new { Token = jwtToken });
}
以上给出了 .Net Core实现JWT授权认证
的完整攻略,并且提供了两个实例说明,希望能够帮到你。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net Core实现JWT授权认证 - Python技术站