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 使用 iat
和 exp
作为声明名称,我不知道规范中有 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 连接中的访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章