我正在嘗試實現刷新密鑰存儲庫(JWT)。目前看起來是這樣的:
public class AuthenticateController : ControllerBase
{
ConcurrentDictionary<string, string> refreshTokens = new ConcurrentDictionary<string, string>();
....
....
....
public async Task<IActionResult> Login()
{
...
GenerateRefreshToken()
...
}
public string GenerateRefreshToken(ApplicationUser user)
{
var randomNumber = new byte[32];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(randomNumber);
var token = Convert.ToBase64String(randomNumber);
refreshTokens.AddOrUpdate(user.Id, token, (key, oldValue) => token);
return token;
}
}
public async Task<IActionResult> RefreshToken([FromBody] RefreshModel model)
{
....
refreshTokens.TryGetValue(user.Id, out string savedRefreshToken);
if (savedRefreshToken != model.RefreshToken)
throw new SecurityTokenException("Invalid refresh token");
...
}
(我刪除了我認為不需要解釋的代碼)
用戶嘗試登錄,有關第一個更新密鑰的信息輸入到集合中。我放了一個斷點,你可以看到輸入的信息:
JWT密鑰過期后,前端發送更新密鑰的請求。但是集合是空的。為什么會這樣?我以前絕對不會清理這些藏品。
我認為問題可能是web api處理每個新請求時相互隔離。我該如何解決這個問題?
控制器是暫時的,這意味著每次請求傳入時它們都會被新實例化。所以你的字典在兩次請求之間就被刪除了。
為了解決這個問題,您將字典設置為靜態的,如下所示:
現在,它將在應用程序的生命周期內生存。