2017-05-04 13 views
-1

ハイブリッド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_tokenaccess_tokenは新しい値に更新されます。だから論理的に例外が発生し、Viewは返されません。 このメソッドが2回目に呼び出されると、refresh_tokenは最初のrefresh_tokenと同じ値を持ちます。したがって、refresh_tokenが期限切れになったためIdentityServerに対して無効な要求を行う(IdentityServerは{"error":"invalid_grant"}を返します)。

私の仮定は、ビューが返されていないため、ユーザーのトークンが実際に更新されていないということですが、refresh_tokenが期限切れのマークが付けられます。

新しい状況refresh_tokenを使用してaccess_tokenをリフレッシュするにはどうすればよいですか?

+1

は、なぜあなたはRenewToken呼び出しの後に投げていますか?要求が完了する前に –

+0

は、パイプラインのどこかの例外を説明するために。 – user1336

+0

誤ったコードの適切な例でない場合、コードスニペットは誤解を招きます。問題を再現するために使用できる[mcve]を提供します。 – Nkosi

答えて

0

さて、あなたは、例外をキャッチし、新しいrefresh_tokenを返すように試みることができます。それが不可能な場合は、古いrefresh_tokenをデータベースと新しいデータベースに保存し、両方を受け入れることができます。もちろんそれはあまり安全ではありません。おそらく、古いrefresh_tokenが有効な時間を制限することができます。

関連する問題