0

我有一个 ID4 身份验证服务器,它与一个使用 SilentRefresh 和 PCKE 授权流程实现angular-oauth2-oidc的 Angular 应用程序配合得很好。

一切运行良好 - 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 并且我没有AllowOfflineAccess在 ID4 端设置为 true。此处是否使用了刷新令牌 - 是否以某种方式隐含配置 - 如果是这样,为什么您可以允许 RefreshTokens 的生命周期比 AccessTokens 长?

4

1 回答 1

1

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

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

于 2021-02-03T07:39:36.327 回答