【问题标题】:How to handle expiration of refresh token如何处理刷新令牌过期
【发布时间】:2019-01-23 17:30:33
【问题描述】:

您好,我在摆弄身份服务器 4。我浏览了一些关于复数视图的视频,讲师浏览了一些关于如何使用刷新令牌刷新我的访问令牌的代码。

我的问题是刷新令牌过期时会发生什么?我试图通过设置AbsoluteRefreshTokenLifetime=15 来查看会发生什么,但是当时间过去时,即当我尝试从资源服务器获取数据时,我会得到一个错误。我希望重定向到登录页面

处理过期的刷新令牌的正确方法是什么?如果正确的方法是强制用户登录,那么请提供执行此操作的代码,因为 ids4 默认不执行此操作。我似乎无法让它工作。

new Client
{
    ClientId = "mvc2",
    ClientName = "MVC Client2",
    AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,

    ClientSecrets =
    {
        new Secret("secret".Sha256())
    },

    RedirectUris = { "http://localhost:5001/signin-oidc" },
    PostLogoutRedirectUris = { "http://localhost:5001/signout-callback-oidc" },

    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
        "api1"
    },
    AllowOfflineAccess = true,
    RequireConsent = false,
    AccessTokenLifetime = 15,
    AbsoluteRefreshTokenLifetime = 15,
    IdentityTokenLifetime = 15
}

【问题讨论】:

  • Identity Server 不关心处理刷新令牌。由每个客户端来处理来自资源服务器的 401 过期响应,然后将刷新令牌交换为新的访问令牌。此外,我不认为刷新令牌用于涉及用户的 OpenId 流中,仅在机器到机器流中使用,例如客户端凭据。混合流除外。
  • @VidmantasBlazevicius 客户端凭据是一种不支持刷新令牌的流程。它不需要,因为它知道凭据。对于支持的流:docs.identityserver.io/en/release/topics/…

标签: c# .net-core identityserver4


【解决方案1】:

刷新令牌的范围offline_access。这意味着客户端可以代表用户请求访问令牌,而无需与用户交互。

根据流程,当用户登录时,客户端会收到三个令牌:访问令牌、身份令牌和刷新令牌。

作为一个自动化(离线)过程,没有登录页面。没有活跃用户,所以返回只是未经授权的。这意味着一旦过期,用户必须再次登录才能再次启动进程

当 api 现在无法访问时,用户可能仍然可以访问网站(使用 cookie)。你可以用hybrid flowsample模拟这个。

使用 IdentityServer 的配置,您有多种选择。您可以选择滑动到期,这意味着刷新令牌“永不过期”。您可以将其设置为仅使用一次。

我相信默认情况下令牌设置为一次使用,这将触发 IdentityServer 在每次请求新的访问令牌时添加一个新的刷新令牌。设置固定过期时间将确保用户必须不时登录。

就寿命而言:

access token < refresh token <= AbsoluteRefreshTokenLifetime.

只需确保刷新令牌不会过期且不会丢失。

如果您遇到刷新令牌丢失或过期的情况,请注销用户。转到将用户重定向到登录页面的安全页面。

这取决于您的配置,但您可以执行以下操作来注销用户:

await HttpContext.SignOutAsync("Cookies");
return LocalRedirect($"/secured");

在这种情况下,用户可能不必登录,因为由于 SSO cookie,用户仍然可以处于活动状态。

如果您想要完全退出(所有网站):

await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc");

【讨论】:

  • 由于某种原因等待 HttpContext.SignOutAsync 不会导致注销。我必须重定向到注销操作才能注销。
猜你喜欢
  • 2019-09-05
  • 1970-01-01
  • 2019-01-24
  • 2019-02-10
  • 2019-03-23
  • 1970-01-01
  • 2014-08-01
  • 2014-06-15
  • 1970-01-01
相关资源
最近更新 更多