OpenId connect中的访问令牌expires_in或expires_at?



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

下面是一个片段,显示了我所指的内容 - 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"可能不是指访问令牌,而是整个身份验证票证?请纠正我,我真的很困惑。

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 身份的东西,所以它很可能是图书馆存储的计算值,与identityserver4或 OpenID Connect 完全无关。

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

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

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

相关内容

最新更新