C# 如何在asp.net core 3.1中使用自动生成的刷新令牌?
在我的ASPNETCore3.1项目中,我使用CQRS模式和JWT身份验证,我希望 为了在令牌过期时实现自动刷新令牌,而不是每次用户都要求输入用户名和密码,我也不想在db中存储刷新令牌。刷新令牌的最佳方式是什么C# 如何在asp.net core 3.1中使用自动生成的刷新令牌?,c#,security,asp.net-core,jwt,C#,Security,Asp.net Core,Jwt,在我的ASPNETCore3.1项目中,我使用CQRS模式和JWT身份验证,我希望 为了在令牌过期时实现自动刷新令牌,而不是每次用户都要求输入用户名和密码,我也不想在db中存储刷新令牌。刷新令牌的最佳方式是什么 public class JwtGenerator : IJwtGenerator { private readonly SymmetricSecurityKey _key; public JwtGenerator(IConfigurat
public class JwtGenerator : IJwtGenerator
{
private readonly SymmetricSecurityKey _key;
public JwtGenerator(IConfiguration config)
{
_key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.GetSection("AppSettings:Token").Value));
}
public string GenerateToken(int size=32)
{
var randomNumber = new byte[size];
using var rng = RandomNumberGenerator.Create();
rng.GetBytes(randomNumber);
return Convert.ToBase64String(randomNumber);
}
public string CreateToken(User user)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.UserName),
new Claim(ClaimTypes.Role, user.Role.ToString("G").ToLower())
};
var creds = new SigningCredentials(_key, SecurityAlgorithms.HmacSha512Signature);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
我的jwtgenerator类用于令牌和刷新令牌
public class JwtGenerator : IJwtGenerator
{
private readonly SymmetricSecurityKey _key;
public JwtGenerator(IConfiguration config)
{
_key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.GetSection("AppSettings:Token").Value));
}
public string GenerateToken(int size=32)
{
var randomNumber = new byte[size];
using var rng = RandomNumberGenerator.Create();
rng.GetBytes(randomNumber);
return Convert.ToBase64String(randomNumber);
}
public string CreateToken(User user)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.UserName),
new Claim(ClaimTypes.Role, user.Role.ToString("G").ToLower())
};
var creds = new SigningCredentials(_key, SecurityAlgorithms.HmacSha512Signature);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
登录后,我将返回正确的结果:
{
"token": "mytoken",
"refreshToken": "tha1qH7PTx4PNoVeD7D7h/BmEZfdS42zWxriexePWlg="
}
另外,我没有找到任何CQR的例子。你在那里做的事情被称为“输入”。在我看来,这几乎是一个最小的实现。您需要具有刷新令牌值或至少一个将令牌锚定在授权层中的参考值。它不必是一个数据库来存储这样的值,您可以有内存存储、物理文件或任何您想要的东西。但无论如何,您需要保留该值以便稍后验证 下面是标准通信流,它解释了使用刷新令牌的场景
public class JwtGenerator : IJwtGenerator
{
private readonly SymmetricSecurityKey _key;
public JwtGenerator(IConfiguration config)
{
_key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.GetSection("AppSettings:Token").Value));
}
public string GenerateToken(int size=32)
{
var randomNumber = new byte[size];
using var rng = RandomNumberGenerator.Create();
rng.GetBytes(randomNumber);
return Convert.ToBase64String(randomNumber);
}
public string CreateToken(User user)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.UserName),
new Claim(ClaimTypes.Role, user.Role.ToString("G").ToLower())
};
var creds = new SigningCredentials(_key, SecurityAlgorithms.HmacSha512Signature);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
1.5。刷新令牌
刷新令牌是用于获取访问令牌的凭据。刷新
令牌由授权服务器颁发给客户端,并且
用于在当前访问令牌失效时获取新的访问令牌
变得无效或过期,或获取其他访问令牌
具有相同或较窄的范围(访问令牌可能具有较短的
生存期和权限少于资源授权的权限
所有者)。发布刷新令牌是可选的,由
授权服务器。如果授权服务器发出刷新
令牌,它包括在发出访问令牌时(即,中的步骤(D))
图1)
刷新令牌是表示授予的授权的字符串
客户端由资源所有者创建。字符串通常对用户是不透明的
客户。令牌表示用于检索授权信息的标识符。与访问令牌不同,刷新令牌是
仅用于授权服务器,从不发送
到资源服务器
+--------+ +---------------+
| |--(A)------- Authorization Grant --------->| |
| | | |
| |<-(B)----------- Access Token -------------| |
| | & Refresh Token | |
| | | |
| | +----------+ | |
| |--(C)---- Access Token ---->| | | |
| | | | | |
| |<-(D)- Protected Resource --| Resource | | Authorization |
| Client | | Server | | Server |
| |--(E)---- Access Token ---->| | | |
| | | | | |
| |<-(F)- Invalid Token Error -| | | |
| | +----------+ | |
| | | |
| |--(G)----------- Refresh Token ----------->| |
| | | |
| |<-(H)----------- Access Token -------------| |
+--------+ & Optional Refresh Token +---------------+
Figure 2: Refreshing an Expired Access Token
+----------++---------------+
|(A)授权授予|
| | | |
| || | | |
| | | | | |
| || | | |
| | | | | |
| || |
| | | |
| |