0

ASP.NETコア& ASP.NETコアIDを使用してJWTトークンを生成します。Asp.NETコアでJWTトークンを破棄できますか?

クライアントサイドでは、トークンを作成するためのreact(SPA)アプリケーション呼び出しAPIにサブリクエストとしてAuthorization: BearertokenFromApiが含まれています。

ログアウトしたいときはどうすればすぐにサーバー側でトークンを期限切れにできますか?

現在、私はちょうどクライアント側のbearトークンを削除し、次の要求には含まれていませんか?

リファレンスhttps://blogs.msdn.microsoft.com/webdev/2017/04/06/jwt-validation-and-authorization-in-asp-net-core/


コードConfigureセクションでStartup.cs

app.UseJwtBearerAuthentication(new JwtBearerOptions 
{ 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    TokenValidationParameters = new TokenValidationParameters 
    { 
     ValidIssuer = "MySite", 
     ValidAudience = "MySite", 
     ValidateIssuerSigningKey = true, 
     IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("[email protected]@TISSECURE")), 
     ValidateLifetime = true 
    } 
}); 

APIでは、W、トークン

[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("[email protected]@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); 
    } 
} 

答えて

3

あなたは簡単にそれが期限切れになることはできません作成します/ oロシンいくつかの利点や解決策を大幅に複雑にする。

最善の方法は、アクセストークンの時間を十分に短くすることです(< = 5分)、リフレッシュトークンを長時間実行することです。

しかし、あなたが本当にすぐにそれを無効にしたい場合は、いくつか必要になります。トークンは、トークンの有効期限限り継続して作成された後(の両方を

  1. キャッシュトークンのIDを、アクセスとリフレッシュトークン)
  2. [ファーム/複数インスタンスの場合] redisのような分散キャッシュにキャッシュする必要があります
  3. [ファーム/複数のインスタンスの場合]メッセージバス経由で伝播する必要があります、RabbitMQまたはAzure Message Bus)をアプリケーションのすべてのインスタンスに適用することで、ローカルメモリキャッシュに格納することができます(したがって、ha
  4. 認証中に、IDがキャッシュ内にまだ存在するかどうかを検証する必要があります。ユーザーがログアウトすると、キャッシュからアイテムを削除する必要があります。
  5. [ファーム/複数インスタンスの場合]分散キャッシュから項目を削除し、彼らは彼らのローカルキャッシュから削除することができますので、メッセージバス/配布キャッシュを必要としない

他のソリューションが必要となるすべてのインスタンスにメッセージを送信JWTトークンの主な利点を失って、1回のリクエストごとに認証サーバーに連絡します。

JWTの主な利点は、それらが自己完結しており、Webサービスがそれを検証するために別のサービスを呼び出す必要がないことです。署名を検証することによって(トークンはユーザが署名を無効にして変更することはできないため)、トークンが意味する有効期限/視聴者によってローカルに検証することができます。