我们可以在Asp.NET Core中销毁JWT令牌吗?
我使用ASP.NET Core&ASP.NET核心身份来生成JWT令牌。
在客户端,我的反应(SPA)应用程序调用API来创建令牌,然后在子请求中包含Authorization: Bearer
tokenFromApi
。
当我想注销时,我该如何立即使服务器端的令牌失效?
目前我只是在客户端删除了bear
标记,并且未包含在下一个请求中?
参考 :https://blogs.msdn.microsoft.com/webdev/2017/04/06/jwt-validation-and-authorization-in-asp-net-core/
Startup.cs
中的Configure
部分中的代码
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = "MySite",
ValidAudience = "MySite",
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("VERYL0NGKEYV@LUETH@TISSECURE")),
ValidateLifetime = true
}
});
API来创建令牌
[HttpPost("Token")]
public async Task<IActionResult> CreateToken([FromBody] LoginModel model)
{
try
{
var user = await userManager.FindByNameAsync(model.Email);
if (passwordHasher.VerifyHashedPassword(user, user.PasswordHash, model.Password) == PasswordVerificationResult.Success)
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.Email, user.Email)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("VERYL0NGKEYV@LUETH@TISSECURE"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
"MySite",
"MySite",
claims,
expires: DateTime.UtcNow.AddMinutes(45),
signingCredentials: creds);
return Ok(new
{
Token = new JwtSecurityTokenHandler().WriteToken(token),
Expiration = token.ValidTo,
});
}
return BadRequest();
}
catch (Exception ex)
{
logger.LogError(ex.ToString());
return StatusCode((int)HttpStatusCode.InternalServerError);
}
}
你不能轻易过期,不会失去它的某些优点或使解决方案显得更复杂。
最好的办法是让访问令牌的时间足够短(<= 5分钟),刷新令牌长时间运行。
但是,如果你真的想立即失效,你需要做一些事情:
其他不需要消息总线/可分发缓存的解决方案需要在每个请求中联系auth服务器,从而消除了JWT令牌的主要优势。
JWT的主要优势在于它们是独立的,Web服务不必调用其他服务来验证它。 它可以通过验证签名进行本地验证(因为令牌不能被用户改变而不会使签名无效)和令牌所指定的到期时间/受众。
链接地址: http://www.djcxy.com/p/22433.html