Мне нужно сделать JWT access и refresh tokens на asp.net
时间: 2024-09-11 22:05:50 浏览: 40
Элбон -- Машинное обучение с использованием Python -- 2019.pdf
在ASP.NET中创建JWT(JSON Web Tokens)访问令牌和刷新令牌是一个常见的操作,用于安全地处理用户身份验证和授权。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。以下是如何在ASP.NET Core中生成和管理这两个令牌的基本步骤:
1. 安装依赖包:
首先,在你的项目中安装`Microsoft.AspNetCore.Authentication.JwtBearer`和`Microsoft.IdentityModel.Tokens` NuGet包。
```sh
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package Microsoft.IdentityModel.Tokens
```
2. 创建配置:
在`appsettings.json`或`appSettings.Development.json`文件中添加JWT相关的配置,包括发行者密钥、有效期等。
```json
{
"Authentication": {
"JwtBearer": {
"TokenValidationParameters": {
"Issuer": "your-issuer",
"Audience": "your-audience",
"Expiration": "3600", // token有效期,单位秒,默认为1小时
"SigningCredentials": {
"Key": "your-secret-key", // 使用的私钥字符串
"Algorithm": "HS256" // 或者RSA等算法,这里使用HMAC SHA256
}
}
}
}
}
```
3. 设置中间件:
在Startup.cs中的ConfigureServices方法里,添加JWT验证服务:
```csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
Configuration.Bind("Authentication:JwtBearer", options);
});
}
```
4. 中间件启用和授权:
在Configure方法中启用JWT中间件,并将[Authorize]属性应用到受保护的控制器或操作上:
```csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseRouting();
app.UseAuthentication(); // 应用JWT验证
app.UseAuthorization();
// 其他中间件和路由配置...
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers().RequireAuthorization(); // 所有请求都需要认证
});
}
```
5. 生成访问令牌(Access Token):
在需要提供给用户的API端点上,你可以创建一个新的JWT并返回给客户端。这通常在身份验证成功时完成:
```csharp
[HttpPost("login")]
[AllowAnonymous]
[ProducesResponseType(StatusCodes.Status200OK, typeof(TokenResponse))]
public async Task<IActionResult> Login(LoginRequest request)
{
// 登录逻辑...
var claimsPrincipal = await AuthenticateUserAsync(request.Username, request.Password);
if (claimsPrincipal != null)
{
var tokenHandler = new JwtSecurityTokenHandler();
var securityToken = tokenHandler.CreateToken(
new SecurityTokenDescriptor
{
Subject = claimsPrincipal,
Expires = DateTime.UtcNow.AddHours(1), // 设置访问令牌的有效期
SigningCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HS256),
Claims = GetClaimsFromPrincipal(claimsPrincipal) // 根据需要填充其他自定义信息
});
return Ok(new TokenResponse { AccessToken = tokenHandler.WriteToken(securityToken) });
}
return Unauthorized();
}
private List<Claim> GetClaimsFromPrincipal(ClaimsPrincipal principal)
{
// 添加用户ID、角色等自定义声明
// ...
}
```
6. 生成刷新令牌(Refresh Token):
如果你想支持刷新令牌,可以在登录时额外发出一个长期有效的刷新令牌。当原始访问令牌过期时,客户端可以用刷新令牌请求新令牌。
- 用户登录时同时发送用户名和密码,获取访问令牌和刷新令牌。
- 将刷新令牌存储在数据库或安全的键值存储中,并设置更长的过期时间。
注意:以上代码示例简化了实际场景,生产环境还需要考虑错误处理、异常处理以及数据库存储等问题。同时,确保妥善保管和传输密钥,以保证安全性。
阅读全文