【问题标题】:Why can I still request an access token if refresh token has expired?如果刷新令牌已过期,为什么我仍然可以请求访问令牌?
【发布时间】:2020-04-14 15:03:05
【问题描述】:

我有一个关于刷新令牌的问题。我在 Identity Server 中配置了我的 Angular 客户端,如下所示:

RefreshTokenUsage = TokenUsage.OneTimeOnly,
AccessTokenLifetime = 30,
AbsoluteRefreshTokenLifetime = 3600,
RefreshTokenExpiration = TokenExpiration.Sliding,
SlidingRefreshTokenLifetime = 60,

另外,我的 Angular 客户端使用“静默更新”机制(使用 angular-auth-oidc-client)。

如果 Angular 客户端启动,20 秒后“静默更新”会启动并要求新的访问令牌,这是有道理的,因为这大约是 30 秒访问令牌生命周期的 75%)。它获得了一个新的访问令牌,并且一切都在继续工作。

在给定的时刻,我停止了无声更新。这意味着它不再刷新访问令牌,事实上,一段时间后我对 web api 的调用失败了,因为访问令牌已过期。

现在,几分钟后我重新启动“静默更新”。

奇怪的是它成功获取了新的访问令牌,但我的理解是这应该不再起作用,因为刷新令牌应该在 60 秒后过期?

我可能误解了这种滑动刷新令牌机制的工作原理。有人可以解释为什么我仍然可以使用已过期的刷新令牌请求新的访问令牌吗?

【问题讨论】:

    标签: angular asp.net-core asp.net-web-api identityserver4 angular-auth-oidc-client


    【解决方案1】:

    我们最近使用 Angular SPA 中的 oidc 库实现了静默更新。

    我的理解是客户端库静默续订机制不使用刷新令牌策略,而是在每次请求静默续订并获取新的id令牌和访问令牌时以prompt=none调用授权请求。

    它还使用 OIDC 会话管理,使用 Iframe 来跟踪会话到期。您可以在浏览器中看到该 cookie。

    【讨论】:

    • 谢谢。你的回答让我想到了一些事情。有一个选项 use_refresh_token:“布尔属性设置为 false。默认使用标准静默更新模式。可以激活刷新令牌。”所以也许,如果我将其设置为 true,它将开始使用刷新令牌?我会做一个测试,看看这是否有影响。
    • 我试过了,但如果刷新令牌过期,它仍然会更新:“如果你将 use_refresh_token 设置为 true,但没有 refresh_token,库会自动尝试进行静默更新,因此需要iframe。如果您已将 log_console_debug_active 设置为 true,您将看到类似这样的控制台条目 no refresh token found,使用静默更新说明这一点。如果我不想这样,我想我应该禁用静默更新,大概?
    • 我想我会以不同的方式处理这个问题。我只是像现在一样允许静默刷新,但构建了一个空闲超时机制,如果用户在一段时间内不活动,则会注销用户。
    猜你喜欢
    • 2018-06-05
    • 2014-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2017-10-28
    • 2019-05-31
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多