2016-10-19 3 views
7

저는 AspNet.Security.OpenIdConnect.Server를 사용하여 JWT 토큰을 발행하고 AuthorizationCodeLifetime을 테스트를 위해 30 초로 설정했습니다.왜 JWT 무기명 인증 토큰이 5 분 후에 만료 된 것으로 인식합니까?

"expires_in": 30, 

및 역 직렬화 된 토큰은 다음과 같은 주장이 포함되어 :

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

로를 저는 여기에 옵션

 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); 

반환 된 토큰이 포함를 설정하는 데 사용하고 코드의 조각이다 당신은 exp (expire time)가 iat (issue time) 이후 30 초임을 알 수 있습니다. 그러나 토큰이 만료 된 후 5 분이 지나야 만 토큰이 401 Unauthorized를 트리거하지 않습니다. exp 번호를 http://www.epochconverter.com/에 연결하면 2016 년 10 월 19 일 수요일 오후 2시 14 분 10 초에 현지 시간으로 오후 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 분을 기다렸다가 토큰의 유효성을 검사하려고 시도했지만, 내 말을해야합니다. 우편 배달부에서 테스트를하고 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 분의 버퍼가 내장되어 있습니까? 무슨 일이야?

당신이 부르는 "버퍼는"실제로 내장 "클럭 스큐"로 알려져 있으며, 웹에서 클럭 동기 이탈의 영향을 완화하도록 설계되었습니다 (Microsoft에서 개발)에 JWT 베어러 미들웨어가 제공하는 기능 전원.

알아 낸 바대로 the default value is set to 5 minutes이지만 JwtBearerOptions.TokenValidationParameters.ClockSkew을 통해 변경 될 수 있습니다.

관련 문제