ハイブリッドMVCクライアントはrefresh_token
を使用してaccess_token
をリフレッシュしようとします。サービスにラップされたコードは、https://github.com/IdentityServer/IdentityServer4.Samples/blob/293622b8438d27f4c9c2574e43fe92a22560ac6b/Clients/src/MvcHybrid/Controllers/HomeController.cs#L46と非常によく似ていますが、リダイレクトは行われませんが、新しいaccess_token
が返されます。要求パイプラインのサービスコールの後には、完全に無関係なものが間違っています(私は再現しやすいケースを作成しようとしました)。更新トークンの有効期限が切れているアクセストークンを要求する
[Authorize]
public async Task<IActionResult> RefreshToken()
{
ViewBag.AccessToken = await _securityTokenService.RenewToken(HttpContext);
// Something unrelated goes wrong.
throw new Exception();
// This logically never happens causing the problem.
return View("Secure");
}
これがうまくいくとrefresh_token
とaccess_token
は新しい値に更新されます。だから論理的に例外が発生し、Viewは返されません。 このメソッドが2回目に呼び出されると、refresh_token
は最初のrefresh_token
と同じ値を持ちます。したがって、refresh_token
が期限切れになったためIdentityServerに対して無効な要求を行う(IdentityServerは{"error":"invalid_grant"}
を返します)。
私の仮定は、ビューが返されていないため、ユーザーのトークンが実際に更新されていないということですが、refresh_token
が期限切れのマークが付けられます。
新しい状況refresh_token
を使用してaccess_token
をリフレッシュするにはどうすればよいですか?
は、なぜあなたはRenewToken呼び出しの後に投げていますか?要求が完了する前に –
は、パイプラインのどこかの例外を説明するために。 – user1336
誤ったコードの適切な例でない場合、コードスニペットは誤解を招きます。問題を再現するために使用できる[mcve]を提供します。 – Nkosi