请求具有过期刷新令牌的访问令牌

请求具有过期刷新令牌的访问令牌

问题描述:

混合型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从不返回。 第二次调用此方法时,refresh_token与第一次调用refresh_token的值相同。因此,向IdentityServer发出无效请求,因为refresh_token已过期(IdentityServer将返回{"error":"invalid_grant"})。

我的假设是,因为未返回视图,用户的令牌实际上不刷新,但refresh_token被标记为过期。

我该如何处理这种情况,以便使用新的refresh_token来刷新access_token

+1

为什么在RenewToken调用之后抛出? –

+0

在请求完成之前在流水线中的某个地方说明异常。 – user1336

+0

如果代码片段不是故障代码的正确示例,则该代码片段具有误导性。提供可用于重现问题的[mcve]。 – Nkosi

那么,你可以尝试捕捉异常并返回新的refresh_token。如果这是不可能的,你可以将旧的refresh_token保存在你的数据库和新的数据库中,并接受两者。当然这不是很安全。也许你可以限制旧的refresh_token有效的时间。