2016-10-19 7 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(期限切れ時間)は、iat(発行時間)の後30秒です。それでも、トークンは、有効期限が切れてから5分が経過するまで、401 Unauthorizedをトリガーしません。私たちがexp番号をhttp://www.epochconverter.com/に差し込むと、これは水曜日、2016年10月19日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分待ってからトークンを検証しようとしたときに起こったことですが、私の言葉を受けなければなりません。私は郵便配達でテストしていて、401を返すまで1秒ごとに「送信」をクリックしていました。

どうしたのですか?私が気付いていない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ベアラーミドルウェアが提供する組み込みの機能です。農場。

数字はthe default value is set to 5 minutesですが、JwtBearerOptions.TokenValidationParameters.ClockSkewで変更できます。

関連する問題