我正在为我的一个Identity Server 3客户端使用授权代码流,并按如下方式配置:
ClientId = "tripgalleryauthcode",
ClientName = "Trip Gallery",
Flow = Flows.AuthorizationCode,
AllowAccessToAllScopes = true,
RequireConsent = false,
// redirect = URI of our callback controller in the IOS application
RedirectUris = new List<string>
{
"somecallbackuri"
},
ClientSecrets = new List<Secret>()
{
"somesecret"
},
// refresh token options
AccessTokenType = AccessTokenType.Jwt,
AccessTokenLifetime = 120,
RefreshTokenUsage = TokenUsage.OneTimeOnly,
RefreshTokenExpiration = TokenExpiration.Absolute,
AbsoluteRefreshTokenLifetime = 360,
如您所见,它被配置为在2分钟内使访问令牌到期,在6分钟内使刷新令牌到期。我这样做是因为我想尝试在更短的时间范围内调试问题而不是我在生产中使用的那个:刷新令牌15天,访问令牌1小时。我们注意到由于某种原因,今天发布的刷新令牌明天不起作用。这就是为什么我决定减少时间,这就是发生的事情:
我注意到了更多。发生的事情是访问令牌到期后2分钟我得到400错误。它说刷新令牌无效。
这是来自Identity Server的日志。
w3wp.exe Information: 0 : 2016-11-23 10:56:15.802 +00:00 [Information] Start token request
w3wp.exe Information: 0 : 2016-11-23 10:56:15.802 +00:00 [Information] Client secret id found: "tripgalleryauthcode"
w3wp.exe Information: 0 : 2016-11-23 10:56:15.802 +00:00 [Information] Client validation success
w3wp.exe Information: 0 : 2016-11-23 10:56:15.802 +00:00 [Information] Start token request validation
w3wp.exe Information: 0 : 2016-11-23 10:56:15.802 +00:00 [Information] Start validation of refresh token request
w3wp.exe Warning: 0 : 2016-11-23 10:56:15.802 +00:00 [Warning] "Refresh token has expired"
"{
\"ClientId\": \"tripgalleryauthcode\",
\"ClientName\": \"Trip Gallery\",
\"GrantType\": \"refresh_token\",
\"RefreshToken\": \"d12f50289e5cded13082de989a64ac01\",
\"Raw\": {
\"grant_type\": \"refresh_token\",
\"refresh_token\": \"d12f50289e5cded13082de989a64ac01\"
}
}"
w3wp.exe Information: 0 : 2016-11-23 10:56:15.818 +00:00 [Information] End token request
w3wp.exe Information: 0 : 2016-11-23 10:56:15.818 +00:00 [Information] Returning error: invalid_grant
我真的想知道导致该行为的原因以及导致我的到期令牌在截止日期之前到期的原因。
答案 0 :(得分:1)
之所以发生这种情况,是因为JWT内置了一个时钟偏移功能,可以保护您免受同步时钟的影响。如果没有这个,你可能会遇到令牌无效的问题。
此默认值为5分钟 - 这会影响access_token
以及refresh_token
。
您可以在JwtBearerOptions.TokenValidationParameters.ClockSkew
IdentityServer4.AccessTokenValidation.CombinedAuthenticationOptions
更改此值
此行为也在official JWT Draft:
中指定实施者可以提供一些小的余地,通常不超过 几分钟,以解释时钟偏差。它的值必须是一个数字 包含IntDate值。这种说法是可选的。