首页 文章

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

提问于
浏览
-1

混合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"} ) .

我的假设是因为未返回View,所以用户的令牌实际上没有刷新,但 refresh_token 标记为已过期 .

我如何处理这种情况所以新的 refresh_token 用于刷新 access_token

1 回答

  • 0

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

相关问题