Cześć,
próbuję zrobić autoryzację za pomocą JWT w .net core 3.1.
Mam problemy z datą. Dostaję informację, że token wygasł nawet jak jeszcze nie powinien.
Poniżej kod, którym generuję token.
var claims = new[]
{
new Claim("Id", user.tt_id.ToString()),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(configuration.SecretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expiredOn = DateTime.UtcNow.AddMinutes(configuration.TokenExpirationTime);
var token = new JwtSecurityToken(configuration.ValidIssuer,
configuration.ValidAudience,
claims,
expires: expiredOn,
signingCredentials: creds);
Wrzucam też przykładowy token JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJZCI6IjEiLCJqdGkiOiI0Mzk5ZDdmYS1mNzVmLTQ2NWYtYjFiMS1kMjgwOWE0N2IxZWIiLCJleHAiOjE2MTE5MzYyNjgsImlzcyI6IkM1RDNBNDYwLUFGNUYtMzNGRi05NjAwLTMwMDQ2MDc3NEZGOSIsImF1ZCI6IjYyMUI2MkIwLTgzQzItS0s1Ny1CRUFGLTkzNjJEM0QzMUVDNSJ9.ryaxAF7RvFodgLL-jFFvDAETTxG50GK_3gYwNNAajgQ
Powinien być on ważny 3 minuty, jednak tak nie jest. Mam wrażenie, że problem jest z różnicą czasową między UTC.
Wrzucam też moją konfigurację z Starrtup:
var serviceProvider = services.BuildServiceProvider();
var config = services.BuildServiceProvider().GetService<JWTConfiguration>();
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(config.SecretKey));
var tokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = signingKey,
ValidIssuer = config.ValidIssuer,
ValidAudience = config.ValidAudience,
ClockSkew = TimeSpan.Zero
};
services.AddAuthentication(o =>
{
o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(c =>
{
c.RequireHttpsMetadata = false;
c.SaveToken = true;
c.TokenValidationParameters = tokenValidationParameters;
c.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
var userService = serviceProvider.GetService<IUserService>();
if (!userService.CheckJwtToken(context.Request.Headers[HeaderNames.Authorization]).Result)
context.Fail("Błędny token.");
return Task.CompletedTask;
}
};
});
W postmanie dostaję:
Jeżeli zrobię ważność tokenu an ponad godzinę to wtedy jest ok (jakbym miał tą godzinę ważności cofniętą).
Nie bardzo wiem, jak to poprawić. Proszę o pomoc