首页 > 解决方案 > 使用 .NET Core 身份并需要刷新令牌

问题描述

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

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

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

标签: asp.net-identityidentityserver4

解决方案


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

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

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

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

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

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

JWT访问令牌的替代方案是引用访问令牌。有关令牌的更多信息,请在此处阅读我的答案。

引用访问令牌也存储在PersistedGrants 表中,并且可以撤销。


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

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

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

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

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

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

另一种情况是用户注销。在这种情况下,您可以从所有应用程序(属于 IdentityServer 会话的一部分)和 IdentityServer 本身注销用户。确保注销也会从存储中删除刷新令牌。


推荐阅读