expires_in 或 expires_at 用于 OpenId 连接中的访问令牌?

Posted

技术标签:

【中文标题】expires_in 或 expires_at 用于 OpenId 连接中的访问令牌?【英文标题】:expires_in or expires_at used for access tokens in OpenId connect? 【发布时间】:2019-11-28 12:05:27 【问题描述】:

我很困惑为什么 OpenId 连接规范(来源:https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse)引用 JWT 中的“expires_in”键,而在 ASP.NET Core 2 中,使用 IdentityServer4 时使用 expires_at,但如果你想操纵它,你把它称为“expires_in”。 我在这里遗漏了什么吗?

下面是一个 sn-p,显示了我所指的确切内容 - tokenResult 通过传入所需的客户端信息 + 机密(在 tokenClient 中定义)以及当前刷新令牌(存储在当前刷新令牌)。当访问令牌中显示/存储的属性名为“expires_at”时,为什么 tokenResult 具有属性“ExpiresIn”?它们不应该统一吗,即使规范明确规定它应该命名为“expires_in”(属性遵循,但 JWT 中的实际实现没有)?

var tokenResult = await tokenClient.RequestRefreshTokenAsync(currentRefreshToken)
var expiresAt = DateTime.UtcNow + TimeSpan.FromSeconds(tokenResult.ExpiresIn)
updatedTokens.Add(new AuthenticationToken

    Name = "expires_at"
    Value = expiresAt.ToString("o", CultureInfo.InvariantCulture)


编辑:我刚刚意识到'expires_at'可能不是指访问令牌,而是整个身份验证票?请纠正我,我真的很困惑。

【问题讨论】:

【参考方案1】:

JWT 使用 iatexp 作为声明名称,我不知道规范中有 expires_at

expires_in 是在令牌响应中返回的值,它指的是返回的access_token 的生命周期。我怀疑它背后的想法是允许调度刷新,而不必检查令牌中的exp 声明。

您链接到的主题 (https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse) 显示的是令牌端点响应,而不是 JWT 的内容。

您在哪里看到expires_at 浮出水面? AuthenticationToken 我认为是 ASP.Net Identity 的东西,所以它很可能是库存储的计算值,与 identityserver4 或 OpenID Connect 完全无关。

根据您的评论,将是 OIDC 中间件将这些属性添加到登录方案中。在第 138 行查看代码:

https://github.com/aspnet/Security/blob/7e14b052ea9cb935ec4f5cb0485b4edb5d41297a/src/Microsoft.AspNetCore.Authentication.OAuth/OAuthHandler.cs

所以基本上它是特定于 ASP.Net Core 的 OIDC 实现的实现细节,而不是协议本身的一部分。

【讨论】:

在我执行任何这些操作之前,当我执行以下操作时var expires_at = await currentContext.GetTokenAsync("expires_at"); 它似乎返回 expires_at,即使我不知道它存在于何处以及它与什么相关。我明白当我做await currentContext.GetTokenAsync(OpenIdConnectParameterNames.ExpiresIn); 时我在叫什么,但这是不同的。我以为是定制的,但是当新用户通过该代码时没有抛出异常,并且确实返回了一个实际的 DateTime 字符串? 根据您的评论扩展了我的答案。

以上是关于expires_in 或 expires_at 用于 OpenId 连接中的访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章

处理模型表中 expires_in 数据的最佳方法是啥

expires_in max-age 缓存控制不起作用

Redis 如何管理未使用的缓存键?

如何识别OAuth令牌是否已过期?

如何识别 OAuth 令牌是不是已过期?

为什么此代码块在Rails.cache.fetch之后执行