使用 DotNet Core 2.2,我在我的应用程序中使用 JWT 身份验证,同时将令牌存储在 cookie 中。除了令牌过期外,一切都很好。
我在 Startup.cs 中的身份验证有以下选项:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.SlidingExpiration = true;
options.Cookie.Name = "access_token";
options.TicketDataFormat = new SimpleTokenProvider.CustomJwtDataFormat(
SecurityAlgorithms.HmacSha256,
tokenValidationParameters);
options.Cookie.SameSite = SameSiteMode.None;
});
这是我的SimpleTokenProvider.cs
文件:
public AuthenticationTicket Unprotect(string protectedText, string purpose)
{
var handler = new JwtSecurityTokenHandler();
ClaimsPrincipal principal = null;
SecurityToken validToken = null;
try
{
principal = handler.ValidateToken(protectedText, this.validationParameters, out validToken);
var validJwt = validToken as JwtSecurityToken;
if (validJwt == null)
{
throw new ArgumentException("Invalid JWT");
}
if (!validJwt.Header.Alg.Equals(algorithm, StringComparison.Ordinal))
{
throw new ArgumentException($"Algorithm must be '{algorithm}'");
}
}
catch (SecurityTokenValidationException e)
{
return null;
}
catch (ArgumentException e)
{
return null;
}
return new AuthenticationTicket(principal, new AuthenticationProperties(), "Cookie");
}
我的问题是该行handler.ValidateToken(protectedText, this.validationParameters, out validToken)
不断抛出超时异常:
Microsoft.IdentityModel.Tokens.SecurityTokenExpiredException:'IDX10223:生命周期验证失败。令牌已过期。ValidTo: '[PII is hidden]',当前时间:'[PII is hidden]'。
在这种情况下,我想做的是自动生成一个新令牌,或者删除当前的身份验证 cookie。
我该怎么做/最好的方法是什么?