Я использую 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" />
Просто столкнулся с той же проблемой, должен сказать отличное исследование, прежде чем размещать здесь вопрос, а также приятный и простой ответ :-) Молодец! –