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

时间:2017-05-04 19:47:16

标签: c# asp.net-core openid-connect identityserver4

混合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_tokenaccess_token更新为新值。因此逻辑上会在此之后发生异常,并且永远不会返回View。 第二次调用此方法时,refresh_token具有与第一个refresh_token相同的值。因此,由于refresh_token已过期(IdentityServer将返回{"error":"invalid_grant"}),因此向IdentityServer发出无效请求。

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

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

1 个答案:

答案 0 :(得分:0)

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