The*_*gle 3 access-token identityserver4
我使用的是IdentityServer4,其配置在数据库中.客户端(oidc)会进行无声续订.我为客户端设置了以下生命周期设置:
AbsoluteRefreshTokenLifetime = 60 * 30,//30 mins
AccessTokenLifetime = 60 * 5,//5 mins
SlidingRefreshTokenLifetime = 60 * 15 // 15 mins
Run Code Online (Sandbox Code Playgroud)
应该怎么办?令牌的有效期应该是多长时间?应该何时要求用户再次登录?没有关于令牌生命周期刷新时及其过期时的明确文档.
Rua*_*urg 11
访问令牌有两种形式 - 自包含或参考.
JWT令牌将是一个自包含的访问令牌 - 它是一个带有声明和过期的受保护数据结构.一旦API了解了密钥材料,它就可以验证自包含的令牌,而无需与发行者进行通信.这使得JWT难以撤销.它们将一直有效,直到它们过期.
来自http://docs.identityserver.io/en/latest/topics/reference_tokens.html#reference-tokens
刷新令牌允许获得对API的长期访问.
您通常希望尽可能缩短访问令牌的生命周期,但同时不要一次又一次地通过对IdentityServer进行前端通道往返请求新的令牌来打扰用户.
刷新令牌允许在没有用户交互的情况下请求新的访问令牌.每次客户端刷新令牌时,都需要对IdentityServer进行(经过身份验证的)反向通道调用.这允许检查刷新令牌是否仍然有效,或者在此期间是否已被撤销.
来自http://docs.identityserver.io/en/latest/topics/grant_types.html#refresh-tokens
因此,访问令牌是自包含的,这意味着它无法修改.一旦发出,令牌将保持有效直至其到期.这就是为什么你想要使用短期令牌.
为了自动执行访问令牌续订过程,您可以使用刷新令牌.这是一个强大的令牌,因为它可用于在没有用户交互的情况下请求访问令牌.刷新令牌应该是长期存在的(至少比访问令牌长).
刷新令牌到期后,用户必须再次登录.如果没有滑动过期,刷新令牌将在绝对时间内到期,让用户再次登录.
使用滑动到期时,您可以设置更短的刷新令牌生存期.因为每次请求访问令牌时,都会发出新的刷新令牌.延长生命周期并使用过的刷新令牌无效.
只要刷新令牌有效,用户就可以访问资源而无需再次登录.在您的情况下,如果用户处于非活动状态超过30分钟,它将过期.
访问令牌不会自动刷新.您需要在客户端中添加代码以请求新的访问令牌.如果刷新令牌不可用或已过期,您可以将用户发送到登录页面.
根据我的理解, AbsoluteRefreshTokenLifetime 和 SlidingRefreshTokenLifetime 不适用于 oidc 客户端应设置为的隐式流:
http://docs.identityserver.io/en/release/topics/refresh_tokens.html
由于访问令牌的生命周期有限,刷新令牌允许在没有用户交互的情况下请求新的访问令牌。
以下流支持刷新令牌:授权代码、混合和资源所有者密码凭证流。需要通过将 AllowOfflineAccess 设置为 true 来明确授权客户端请求刷新令牌
我遇到了类似的情况,为了测试,我将 cookie 设置为 15 分钟到期并滑动到期,并且根据下面的问题线程,如果使用静默更新,则必须手动处理:
https://github.com/IdentityModel/oidc-client-js/issues/402
我是 javascript 客户端的新手,所以我仍在尝试弄清楚如何确定用户是否存在。我希望 cookie 会为我解决这个问题,但看起来它在我发送的那个线程中不断扩展。
更新
经过测试和大量谷歌搜索后,我能够开始工作/理解访问令牌生命周期和静默更新。
首先,我假设您使用的是 oidc-client 或 redux-oidc。我正在使用 redux-oidc,它只是 oidc-client 的包装器。
由于您将访问令牌生命周期 (AccessTokenLifetime) 设置为 5 分钟,并且无声更新 = true。这将每 2.5 分钟更新一次,或者取决于您将 userManager.accessTokenExpiringNotificationTime 设置为什么。届时,它会根据您将 cookie 过期超时设置为什么来更新访问令牌。饼干是魔法发生的地方。如果 cookie 过期,您将无法再更新访问令牌。cookie 设置如下:
Identity Server start.cs(这将设置 cookie 的滑动过期时间):
var builder = services.AddIdentityServer(options =>
{
options.Authentication.CookieSlidingExpiration = true;
})
Run Code Online (Sandbox Code Playgroud)
身份服务器 AccountController.cs,登录方法(如果您有记住我的功能,您可以更改 IsPersistent 值,tsConfigValue = 15):
var props = new AuthenticationProperties
{
IsPersistent = false,
ExpiresUtc = DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(tsConfigValue))
};
Run Code Online (Sandbox Code Playgroud)
这最终解决了我的访问令牌生命周期和静默更新问题。希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
11803 次 |
| 最近记录: |