混合MVC客户端尝试使用access_token
刷新refresh_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。
第二次调用此方法时,refresh_token
具有与第一个refresh_token
相同的值。因此,由于refresh_token
已过期(IdentityServer将返回{"error":"invalid_grant"}
),因此向IdentityServer发出无效请求。
我的假设是,由于未返回视图,因此用户的令牌实际上未刷新,但refresh_token
标记为已过期。
如何处理这种情况,以便使用新的refresh_token
刷新access_token
?
答案 0 :(得分:0)
好吧,您可以尝试捕获异常并返回新的refresh_token
。如果这不可能,您可以将旧的refresh_token
保存在数据库和新数据库中,并接受这两者。当然那不是很安全。也许你可以限制旧refresh_token
有效的时间。