2016-10-19 3 views
7

Я использую AspNet.Security.OpenIdConnect.Server для выдачи токенов JWT и для AuthorizationCodeLifetime установлено значение 30 секунд для тестирования. Вот фрагмент кода, я использую, чтобы установить параметрыПочему моя аутентификация на предъявителя JWT распознает токены, срок действия которых истекает через 5 минут после того, как токен говорит?

 options.TokenEndpointPath = "/api/token"; 
     options.AllowInsecureHttp = true; 
     options.AccessTokenHandler = new JwtSecurityTokenHandler(); 
     options.SigningCredentials.Add(new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256)); 
     options.AccessTokenLifetime = TimeSpan.FromSeconds(30); 
     options.AuthorizationCodeLifetime = TimeSpan.FromSeconds(30); 

Возвращенный токен содержит:

"expires_in": 30, 

и десериализованный маркер содержит следующие требования:

"nbf": 1476915220, 
"exp": 1476915250, 
"iat": 1476915220, 

Как вы можете видеть, что exp (expire time) составляет 30 секунд после iat (время выпуска). Тем не менее, токен не запускает 401 Unauthorized до 5 минут после его истечения. Если мы включим номер exp в http://www.epochconverter.com/, то мы увидим, что это оценивается в Wed, 19 Oct 2016 22:14:10 GMT, что составляет 5:14:10 по местному времени.

Вот некоторый вошел выход из библиотеки ядра:

Microsoft.IdentityModel.Tokens.SecurityTokenExpiredException: IDX10223: Lifetime validation failed. The token is expired. 
ValidTo: '10/19/2016 22:14:10' 
Current time: '10/19/2016 22:19:10'. 
    at Microsoft.IdentityModel.Tokens.Validators.ValidateLifetime(Nullable`1 notBefore, Nullable`1 expires, SecurityToken securityToken, TokenValidationParameters validationParameters) 
    at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateLifetime(Nullable`1 notBefore, Nullable`1 expires, JwtSecurityToken securityToken, TokenValidationParameters validationParameters) 
    at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken) 
    at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.<HandleAuthenticateAsync>d__1.MoveNext() 
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[7] 
     Bearer was not authenticated. Failure message: IDX10223: Lifetime validation failed. The token is expired. 
ValidTo: '10/19/2016 22:14:10' 
Current time: '10/19/2016 22:19:10'. 

Конечно, этот вывод не доказывает, что сервер принимал маркер между 22:14:10 и 22:19:10. Это было бы так, как если бы я ждал через 5 минут после того, как он истек, а затем попытался проверить токен, но вы должны поверить мне на слово. Я тестировал в Postman и щелкал «Отправить» каждую секунду, пока не вернул 401.

Итак, что случилось? Есть ли встроенный буфер на 5 минут, о котором я не знаю? Интересно, что значение по умолчанию для AccessTokenLifetime составляет 5 минут, но токен определенно отражает то, что я изменил его на 30 секунд. Что происходит?

Соответствующие библиотеки Я использую:

<package id="AspNet.Security.OpenIdConnect.Extensions" version="1.0.0-beta6-final" targetFramework="net452" /> 
<package id="AspNet.Security.OpenIdConnect.Server" version="1.0.0-beta6-final" targetFramework="net452" /> 
<package id="Microsoft.AspNetCore.Authentication.JwtBearer" version="1.0.0" targetFramework="net452" /> 
+0

Просто столкнулся с той же проблемой, должен сказать отличное исследование, прежде чем размещать здесь вопрос, а также приятный и простой ответ :-) Молодец! –

ответ

12

Итак, что случилось? Есть ли встроенный буфер на 5 минут, о котором я не знаю? Что происходит?

То, что вы называете «буфер» на самом деле является встроенной функцией, предложенной однонаправленного промежуточного JWT (разработанный Microsoft), который известен как «часы перекос» и был разработан для смягчения последствий часов десинхронизации в сети фермы.

Как вы выяснили, the default value is set to 5 minutes, но его можно изменить с помощью JwtBearerOptions.TokenValidationParameters.ClockSkew.

Смежные вопросы