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