.NET कोर - JWT - SecurityTokenNoExpirationException
एक लॉगिन पृष्ठ के संदर्भ में , मैं .NET कोर में एक Jwt टोकन बनाने की कोशिश करता हूं ।
मिडलवेयर एक अपवाद फेंक रहा है:
SecurityTokenNoExpirationException
बहुत यकीन है कि सब कुछ जगह में है।
मैंने पीछा किया : https://www.youtube.com/watch?edufilter=NULL&ab_channel=IAmTimCorey&v=9QU_y7-VsC8
यहाँ प्रमाणीकरण नियंत्रक हिस्सा है जो JWT बनाता है:
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(settings.JwtSecret);
var claims = new Claim[]
{
new Claim(ClaimTypes.Name, user.Email),
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Role, user.RoleId.ToString()),
// token not valid before certain date, in our case, make it valid right away
new Claim(JwtRegisteredClaimNames.Nbf, new DateTimeOffset(DateTime.Now).ToUnixTimeMilliseconds().ToString()),
new Claim(JwtRegisteredClaimNames.Exp, new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeMilliseconds().ToString()),
};
var header = new JwtHeader(
new SigningCredentials(
new SymmetricSecurityKey(key),
SecurityAlgorithms.HmacSha256Signature
)
);
var payload = new JwtPayload(claims);
var securityToken = new JwtSecurityToken(header, payload);
var handler = new JwtSecurityTokenHandler();
यहाँ JWT मिडलवेयर को इनिशियलाइज़ करने वाला स्टार्टअप .cs हिस्सा है:
var settings = settingsSection.Get<Settings>();
var key = Encoding.ASCII.GetBytes(settings.JwtSecret);
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
अगर आपको और जानकारी चाहिए तो मुझे बताएं
इस पर मेरी मदद करने के लिए धन्यवाद।
जवाब
एक JWT में टाइमस्टैम्प को UNIX युग में सेकंड के रूप में दर्शाया जाता है , मिलीसेकंड के रूप में नहीं।
RFC7519 संख्यात्मक तिथि को परिभाषित करता है:
एक JSON संख्यात्मक मान 1970-01-01T00: 00: 00Z UTC से निर्दिष्ट UTC तिथि / समय तक, लीप सेकंड को अनदेखा करते हुए।
इसलिए का उपयोग ToUnixTimeSeconds()करने के बजाय ToUnixTimeMilliseconds()जब आप दावे बनाते हैं।