我刚从一家新公司开始,任务是在我们的 .NET/Angular 应用程序上修复我们当前的身份验证过程。 目前,我们使用 .用于登录身份验证的 NEt 核心标识,登录令牌将在 24 小时后过期。
我的任务是通过以下方式更改身份验证: 1(每次用户发送请求时检查令牌(我认为通过使用JWT刷新令牌( 2( 令牌应在 20 分钟不活动后过期,并提示用户再次登录。
所有这些都可以通过身份服务器完成吗?
这取决于客户端的类型和使用的身份验证。首先考虑 cookie 身份验证。
对于使用 Cookie 的客户端,身份验证基于有效 Cookie 的存在。为了注销用户,必须过期或删除cookie。也许使用会话或以其他方式延长生命周期或跟踪活动的 cookie。
困难的部分是 JWT 代币的存在。现在,应用是使用它们来访问其他资源 (API( 还是用于后端 (SPA( 并不重要。
JWT 的本质是它不能被撤销,并且在到期之前一直处于活动状态。好消息是,您可以将生命周期设置为或多或少 20 分钟,同时考虑时钟偏差(默认为 5 分钟(。令牌将自动过期,无需进一步操作。
若要使工作正常,可能需要使用刷新令牌。刷新令牌用于代表用户请求新的访问令牌,而无需用户再次登录。刷新令牌将传递到身份服务器的授权端点,以获取新的访问令牌。
刷新令牌和访问令牌之间的重要区别在于,刷新令牌可以是没有任何意义的任何字符串值,而访问令牌是自包含的 (JWT(。刷新令牌存储在 IdentityServer(持久赠款表(中,并且必须与收到的令牌匹配。这意味着,如果在存储中找不到令牌,则请求将被拒绝。换句话说,刷新令牌可以撤销,这与 JWT访问令牌不同。
JWT访问令牌的替代方法是引用访问令牌。有关令牌的更多信息,请在此处阅读我的答案。
引用访问令牌也存储在 PersistedGrants 表中,可以撤销。
不活动的问题在于客户端无法在服务器上触发操作。因此,服务器端所需的任何操作都必须在那里启动。
客户端只能在用户再次处于活动状态后确定用户的不活动状态。但这很容易,如果没有有效的cookie,用户必须再次登录。
备注:通过单点登录(SSO(,IdentityServer网站上的cookie将自动再次对用户进行身份验证,跳过登录表单。为了绕过这一点,请确保客户端使用参数重定向到IdentityServer:prompt=login。
将访问令牌的生存期设置为 20 分钟后,一切就绪。
但是,刷新令牌仍然有效。幸运的是,您还可以在刷新令牌上设置绝对过期时间。在这种情况下,您也可以考虑将其设置为 20 分钟(通常这将是一个更长的生命周期(。只需确保在过期前 5 分钟内刷新访问令牌即可。顺便说一下,这并没有真正刷新令牌,它会替换存储的令牌。当前令牌在过期之前一直有效(且可用(。
一个备注:刷新令牌必须设置为一次性使用。请求新的访问令牌时,还会返回新的刷新令牌,替换两者。请确保始终及时刷新令牌,无论请求是否需要它。
另一种情况是用户注销。在这种情况下,您可以从所有应用程序(属于 IdentityServer 会话的一部分(和 IdentityServer 本身注销用户。确保注销也会从存储中删除刷新令牌。