首页 > 解决方案 > 使用授权类型代码时silent_redirect_uri 是否已过时

问题描述

我有一个关于刷新访问令牌的问题。

我正在使用具有以下配置的 IdentityServer 4.1.2:

new Client
{
  ClientId = "myid",
  AllowedGrantTypes = GrantTypes.Code,
  RequireClientSecret = false,
  AccessTokenLifetime = 3600,
  RequirePkce = true,
  AllowOfflineAccess = true,
  ...
}

如您所见,我没有使用已弃用的隐式流程,但授权类型设置为代码

我的 SPA 客户端使用 oidc-client 版本 1.11.5,配置如下:

var config = {
    ...
    redirect_uri: `https://myspaurl/callback`,
    response_type: 'code',
    scope: 'openid profile offline_access',
    automaticSilentRenew: true,
    silent_redirect_uri: `https://myspaurl/static/silent-renew.html`,
    ...
  };

请注意,我要求的是offline_access范围,因此我可以获得刷新令牌。

当我运行应用程序时,访问令牌每小时都会更新一次。在 Chrome 开发人员工具的网络选项卡中,我可以看到访问令牌正在使用此请求 url https://myidentityserver/connect/token 进行更新。我的silent_redirect_uri https://myspaurl/static/silent-renew.html 从未被请求过。所以我的问题是,当使用授权类型代码而不是旧的隐式流时,silent_redirect_uri 是否已过时?

标签: refreshidentityserver4access-token

解决方案


如果 oidc 客户端可以获得刷新令牌,它将使用该令牌,而不是尝试使用静默重定向 URI。接下来考虑这些操作:

  • 用户重新加载页面
  • 用户打开新的浏览器选项卡/窗口

如果在重新加载期间 RT 不可用,则 oidc 客户端将回退到静默重定向 URI 行为。

多标签浏览可以使用刷新令牌的唯一方法是将 RT(长期存在的凭据)存储在本地存储中。然后,您将拥有一个可靠的应用程序。

请注意,在隐藏或框架上使用静默重定向 URI 在 Safari 浏览器中不起作用,因为它会丢弃第三方 cookie。预计其他浏览器也会效仿。因此,在 2021 年确实不推荐在隐藏的 iframe 上更新令牌。

安全

问题还没有结束:

  • 绝对不建议将 RT 存储在本地存储中用于中等或高安全性应用程序 - 即使使用旋转刷新令牌

2021 年的建议是将刷新令牌存储在高度加密的 HTTP Only SameSite=strict cookie 中。这被称为前端模式的后端。

这很棘手,但值得注意——也许是未来的目标。另请注意,oidc 客户端现在是一个存档项目。


推荐阅读