ASP.NET CoreおよびASP.NET Core Identityを使用してJWTトークンを生成します。
クライアント側では、私の反応(SPA)アプリがAPIを呼び出してトークンを作成し、サブリクエストにAuthorization: Bearer
tokenFromApi
を含めます。
ログアウトしたい場合、どうすればすぐにサーバー側でトークンを期限切れにできますか?
現在、クライアント側でbear
トークンを削除するだけで、次のリクエストに含まれませんか?
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分)、更新トークンを長時間実行することです。
しかし、本当にすぐに無効にしたい場合は、いくつかのものが必要になります。
メッセージバス/分散キャッシュを必要としない他のソリューションでは、リクエストごとに認証サーバーに接続する必要があり、JWTトークンの主な利点が失われます。
JWTの主な利点は、JWTが自己完結型であり、Webサービスが検証するために別のサービスを呼び出す必要がないことです。これは、署名を検証することにより(ユーザーは署名を無効にしないとトークンを変更できないため)、トークンの有効期限/オーディエンスによってローカルで検証できます。