【问题标题】:Using .NET Core Identity and need to refresh token使用 .NET Core 身份并需要刷新令牌
【发布时间】:2020-05-04 16:56:05
【问题描述】:

我刚开始在一家新公司工作,我的任务是在 .NET/Angular 应用上修复当前的身份验证流程。目前,我们使用 .NET Core Identity 进行登录身份验证,登录令牌在 24 小时后过期。

我的任务是通过以下方式更改身份验证: 1)每次用户发送请求时检查令牌(我认为通过使用 JWT 刷新令牌) 2) 令牌应在 20 分钟不活动后过期,并提示用户再次登录。

所有这些都可以通过 Identity Server 完成吗?

【问题讨论】:

  • JWT 访问令牌不会因为不活动而过期。此类令牌无法更改并在到期前保持有效,并且刷新令牌不必是 JWT。该场景可能是具有短期访问令牌(例如 20 分钟)和一个在 24 小时后过期的刷新令牌。通过滑动到期和绝对到期,您可以延长或限制生命周期。您不需要 IdentityServer,但您可以将它用于此任务。请参阅documentation
  • 那么如何完成因不活动而退出的任务呢?如果您的刷新令牌在 24 小时后过期,这是否意味着用户可以保持空闲 23 小时然后再次开始使用系统?如果这些问题听起来很愚蠢,我很抱歉,但我真的很想理解这些概念。
  • 刷新令牌在这种情况下仍然有效。通常,拥有一个需要用户再次登录的客户端是没有问题的。但是,结合 client_id 和 secret,您也可以使用 Postman 请求访问令牌。对于前端应用程序(您可能难以隐藏秘密),这可能是个问题。
  • 我的回答对您有帮助吗,还是您需要更多信息?
  • 这是一个很好的答案。

标签: asp.net-identity identityserver4


【解决方案1】:

这取决于客户端的类型和使用的身份验证。首先考虑 cookie 身份验证。

对于使用 cookie 的客户端,身份验证基于有效 cookie 的存在。为了注销用户,cookie 必须过期或删除。也许使用会话或以其他方式延长生命周期或跟踪 cookie 的活动。

困难的部分是 JWT 令牌的存在。现在,应用程序使用它们来访问其他资源 (API) 还是用于后端 (SPA) 都无关紧要了。

JWT 的本质是它不能被撤销并且在过期之前一直保持活动状态。好消息是您可以将生命周期设置为或多或少 20 分钟,同时考虑时钟偏差(默认为 5 分钟)。令牌将自动过期,无需进一步操作。

为了保持工作正常,您可能需要使用刷新令牌刷新令牌 用于代表用户请求新的访问令牌,而无需用户再次登录。 refresh token 被传递到 IdentityServer 的授权端点,以获取新的访问令牌

刷新令牌访问令牌之间的一个重要区别是刷新令牌可以是任何没有任何意义的字符串值,而访问令牌是自包含的 (JWT)。 刷新令牌 存储在 IdentityServer(PersistedGrants 表)中,并且必须与收到的令牌相匹配。这意味着如果在商店中找不到令牌,则请求将被拒绝。换句话说,与 JWT 访问令牌不同,刷新令牌可以被撤销。

JWT 访问令牌的替代方案是 reference 访问令牌。有关令牌的更多信息,请阅读我的回答 here

reference 访问令牌也存储在 PersistedGrants 表中,可以撤销。


不活动的问题是客户端无法触发服务器上的操作。因此,任何需要服务器端的操作都必须在那里启动。

客户端只能在用户再次变为活动状态后才能确定用户的不活动状态。但这很简单,没有有效的 cookie 用户必须重新登录。

备注:通过单点登录 (SSO),IdentityServer 网站上的 cookie 将自动再次对用户进行身份验证,跳过登录表单。为了绕过这个,请确保客户端使用参数重定向到 IdentityServer:prompt=login

将访问令牌的生命周期设置为 20 分钟,一切就绪。

但是,刷新令牌仍然有效。幸运的是,您还可以在刷新令牌上设置绝对过期时间。在这种情况下,您也可以考虑将其设置为 20 分钟(通常这将是更长的生命周期)。只需确保在到期前 5 分钟内刷新访问令牌。顺便说一句,这并没有真正刷新令牌,而是替换了存储的令牌。当前令牌在过期之前保持有效(并且可用)。

备注:刷新令牌必须设置为一次性使用。请求新的访问令牌时,也会返回一个新的刷新令牌,替换两者。确保始终及时刷新令牌,无论请求是否需要它。

另一种情况是用户注销。在这种情况下,您可以 signout 来自 all apps 的用户(它们是 IdentityServer 会话的一部分)和 IdentityServer 本身。确保注销也会从商店中删除刷新令牌。

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 2017-11-08
    • 2015-08-13
    • 2020-02-05
    • 2019-12-29
    • 1970-01-01
    • 2021-11-01
    • 2020-07-07
    相关资源
    最近更新 更多