【问题标题】:Silent Refresh Still Works After AccessToken ExpiryAccessToken 到期后静默刷新仍然有效
【发布时间】:2021-05-06 21:28:47
【问题描述】:

我的 ID4 身份验证服务器与 Angular 应用程序配合良好,该应用程序正在使用 SilentRefresh 和 PCKE 授权流程实现 angular-oauth2-oidc

一切都运行良好 - ID4 配置为使用 5 分钟的生命周期为 AccessToken 提供服务,Angular 应用程序将每分钟静默刷新令牌(可能会在 0.75 时间过后更改为刷新)。但是,我发现的问题是,我可以关闭已登录的浏览器-然后在 10 分钟后在站点上再次打开它(在原始 AccessToken 过期而未刷新之后)-但是静默刷新会刷新令牌并且用户保持登录状态。这是一个重大的安全漏洞。

我的客户端配置如下所示:

{
    issuer: config.authServerUrl,
    clientId: '<redacted>', // The "Auth Code + PKCE" client
    responseType: 'code',
    redirectUri: window.location.origin,
    silentRefreshRedirectUri: window.location.origin + '/silent-refresh.html',
    postLogoutRedirectUri: window.location.origin,
    scope: 'openid profile email api',
    useSilentRefresh: true, // Needed for Code Flow to suggest using iframe-based refreshes
    silentRefreshTimeout: 60000, // For faster testing
    sessionChecksEnabled: true,
    showDebugInformation: !config.production, // Also requires enabling "Verbose" level in devtools
    clearHashAfterLogin: false,
    nonceStateSeparator : 'semicolon', // Real semicolon gets mangled by IdentityServer's URI encoding
  }

我的 ID4 配置如下所示:

      {
        "Enabled": true,
        "ClientId": "<redacted>",
        "ClientName": "<redacted>",
        "ClientSecrets": [ { "Value": "<redacted>" } ],
        "AccessTokenLifetime": "300",
        "AllowedGrantTypes": [ "authorization_code" ],
        "AllowedScopes": [ "openid", "profile", "email", "api" ],
        "AllowedCorsOrigins": [
          "http://localhost:4200"
        ],
        "PostLogoutRedirectUris": [
          "http://localhost:4200"
        ],
        "RedirectUris": [
          "http://localhost:4200",
          "http://localhost:4200/silent-refresh.html"
        ]
      }

我希望这种行为是静默刷新仅在我在 AccessToken 的到期时间内再次在网站上打开浏览器时才起作用 - 即,如果我在 AccessToken 过期后打开 - 那么我无法刷新并且需要登录。

似乎静默刷新不使用 RefreshTokens,因为登录时显示的范围不包括 offline_access 并且我没有在 ID4 端将 AllowOfflineAccess 设置为 true。此处是否使用了刷新令牌 - 是否以某种方式隐含配置 - 如果是这样,为什么您可以允许 RefreshTokens 的生命周期比 AccessTokens 长?

【问题讨论】:

    标签: angular identityserver4 angular-oauth2-oidc


    【解决方案1】:

    一种想法是,您的 IdentityServer 在您的初始登录期间设置了自己的“会话”cookie,并且使用该 cookie 允许应用程序静默地重新验证并获取新的访问令牌。您可以从 IdentityServer 调整此 cookie 的生命周期。

    我会使用像Fiddler 这样的代理来验证这种行为。

    【讨论】:

    • 如果他们关闭浏览器的目的是让他们的会话结束,那么在你的identityserver4 IDP 中使用非持久性身份验证 cookie 就可以了。您还应该确保您的客户端应用程序注销机制也通过结束会话端点触发 IDP 的注销。
    • 我希望“记住我”功能可以记住登录屏幕中的用户 - 但不能用于静默刷新 - 我认为,您所说的 ID4“记住我”会话cookie 用于两者....我认为,我需要让客户端应用程序使用刷新令牌,而不仅仅是允许通过会话令牌进行重新身份验证 - 将静默刷新与刷新的“会话 cookie 方法”分开.我想这是通过在客户端应用程序中请求 offline_access 范围 - 并在 ID4 上启​​用 AllowOfflineAccess。我在正确的路线上吗?
    • offline_access 直到给你刷新令牌,那么问题是你应该在后端还是前端进行 openid 连接?见leastprivilege.com/2019/01/18/…
    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2014-12-15
    • 1970-01-01
    • 2021-03-11
    • 2014-01-30
    相关资源
    最近更新 更多