2017-05-30 11 views
4

WebApiプロジェクトで使用するJWTを生成しています。有効期限が過ぎてから提出されたときにトークンを拒否するかどうかをテストできるように、トークンが1分で期限切れになるように設定します。.NetCore JwtBearerAuthenticationが期限切れのトークンを拒否しない

CreateTokenコントローラ

public async Task<IActionResult> CreateToken([FromBody] CredentialModel model) 
{ 
    var user = await _unitOfWork.UserManager.FindByNameAsync(model.UserName); 

    if (user == null) return BadRequest(); 
    if (Hasher.VerifyHashedPassword(user, user.PasswordHash, model.Password) != 
     PasswordVerificationResult.Success) return BadRequest(); 

    var userClaims = awaitUserManager.GetClaimsAsync(user); 

    var claims = new[] 
    { 
     new Claim(JwtRegisteredClaimNames.Sub, user.UserName), 
     new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), 
     new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString()), 
     new Claim(JwtRegisteredClaimNames.GivenName, user.FirstName), 
     new Claim(JwtRegisteredClaimNames.FamilyName, user.LastName), 
     new Claim(JwtRegisteredClaimNames.Email, user.Email) 
    } 
    .Union(userClaims); 

    var cert = new Certificate(Configuration["Tokens:Certificate"]); 
    var token = new JwtSecurityToken(
     issuer: Configuration["Tokens:Issuer"], 
     audience: Configuration["Tokens:Audience"], 
     claims: claims, 
     expires: DateTime.UtcNow.AddMinutes(1), 
     signingCredentials: cert.Signature 
    ); 

    return Ok(new 
    { 
     token = new JwtSecurityTokenHandler().WriteToken(token), 
     expiration = token.ValidTo 
    }); 
} 

トークン認証 - 起動クラス

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
{ 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    TokenValidationParameters = new TokenValidationParameters() 
    { 
     ValidIssuer = Configuration["Tokens:Issuer"], 
     ValidAudience = Configuration["Tokens:Audience"], 
     ValidateIssuerSigningKey = true, 
     IssuerSigningKey = new Certificate(Configuration["Tokens:Certificate"]).SecurityKey, 
     ValidateLifetime = true 
    }, 
}); 

私はvalidateLifetime = tokesは、2分後に拒否されていない真を設定しておりますが。それはトークンを受け入れ続けるでしょう。私が気づいていない、またはセットアップが間違っている最小有効期限はありますか?

+0

私はあなたがこのコードの実行可能なバージョンを持っているとは思いませんか?いずれにしても、私は 'UseJwtBearerAuthentication'のドキュメントを参照しましたが、これは推奨されなくなったようです:/ https://github.com/aspnet/Security/blob/99aa3bd35dd5fbe46a93eef8a2c8ab1f9fe8d05b/src/Microsoft.AspNetCore.Authentication.JwtBearer/JwtBearerAppBuilderExtensions。 cs –

+0

@MariaInesParnisariはい私のコードが実行されており、トークンの発行と検証が機能しています。これは、私が非対称X509Certificate2をインポートするために書いた小さな証明書クラスを除いて、ほとんどすべてです。それはちょうど満了を常に検証するようではない。私はあなたのリンクを見て、それは非難されるようです。しかし、私はそれに取って代わるものは見当たりません。 – Dblock247

+0

このコードがGitHubでホストされているので、私はそれをダウンロードして自分で試すことができます。検証が機能していると言えば、トークンの他のプロパティ(たとえば、視聴者)を手動で変更して失敗したことを確認してみましたか? –

答えて

4

興味があれば私は答えhereを見つけました。

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
{ 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    TokenValidationParameters = new TokenValidationParameters() 
    { 
     ValidIssuer = Configuration["Tokens:Issuer"], 
     ValidAudience = Configuration["Tokens:Audience"], 
     ValidateIssuerSigningKey = true, 
     IssuerSigningKey = new Certificate(certPath: Configuration["Tokens:Certificate"], isValid: false).SecurityKey, 
     ValidateLifetime = true, 
     ValidateIssuer = true, 
     ValidateAudience = true, 
     ClockSkew = TimeSpan.Zero 
    }, 
}); 
+2

clockskewがゼロに設定されていることに注意してください。一部のクライアントで問題が発生する可能性があります。 –

+0

@CyprienAutexierこれは当てはまりますが、大きな有効期限ウィンドウには問題はありません。反対の状況:小さな有効期限ウィンドウでは、トークンの有効期限を厳密に厳守している場合は、おそらくクロックスキューを制限することになります。 – Rob

+0

@CyprienAutexier 1分の有効期限はテストのみです。私は生産を増やします。 Clockskewと有効期限の長さの推奨値。 – Dblock247

関連する問題