请求具有过期刷新令牌的访问令牌
问题描述:
混合型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"}
)。
我的假设是,因为未返回视图,用户的令牌实际上不刷新,但refresh_token
被标记为过期。
我该如何处理这种情况,以便使用新的refresh_token
来刷新access_token
?
答
那么,你可以尝试捕捉异常并返回新的refresh_token
。如果这是不可能的,你可以将旧的refresh_token
保存在你的数据库和新的数据库中,并接受两者。当然这不是很安全。也许你可以限制旧的refresh_token
有效的时间。
为什么在RenewToken调用之后抛出? –
在请求完成之前在流水线中的某个地方说明异常。 – user1336
如果代码片段不是故障代码的正确示例,则该代码片段具有误导性。提供可用于重现问题的[mcve]。 – Nkosi