Это мой Startup.cs
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = "bearer";
x.DefaultChallengeScheme = "bearer";
})
.AddJwtBearer("bearer",x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
//x.TokenValidationParameters = tokenValidationParameters;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SecretKey")),
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidIssuer = Environment.GetEnvironmentVariable(MS_Jwt_Issuer),
ValidAudience = Environment.GetEnvironmentVariable(MS_Jwt_Issuer),
ClockSkew = TimeSpan.Zero,
};
x.Events = new JwtBearerEvents
{
OnAuthenticationFailed = context =>
{
if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
{
context.Response.Headers.Add("Token-Expired", "true");
}
return Task.CompletedTask;
}
};
});
services.AddResponseCaching();
services.AddCors(c =>
{
c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
});
Вот как я устанавливаю токен:
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SecretKey"));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddDays(10),
SigningCredentials = credentials,
IssuedAt = DateTime.UtcNow,
Issuer = Environment.GetEnvironmentVariable(MS_Jwt_Issuer),
Audience = Environment.GetEnvironmentVariable(MS_Jwt_Issuer),
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var refreshToken = tokens.GenerateRefreshToken();
var processedToken = tokenHandler.WriteToken(token);
Всякий раз, когда я аутентифицируюсь, я могу правильно получить токен. Однако, когда я пытаюсь получить доступ к классу, защищенному [Authorize], я получаю следующее исключение:
Исключение: «Microsoft.IdentityModel.Tokens.SecurityTokenExpiredException» в Microsoft.IdentityModel.Tokens.dll
Вот образец моего токена. Он успешно проверяет с моим секретным ключом и дата истечения срока действия показали, собственно, и не истек:
1014 * eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJQaG9uZU51bWJlciI6IjEyMzIxMjMxMjMiLCJuYmYiOjE1ODcwNTAxOTksImV4cCI6MTU4NzkxNDE5OSwiaWF0IjoxNTg3MDUwMTk5LCJpc3MiOiJTUiIsImF1ZCI6IlNSIn0.WbEJq_PAOLvra1ZUwtQEKH9FRBDdb2byw26miUm-KE 1016 * EDIT: 1018 * При попытке вручную проверьте токен, он успешно проверен и срок его действия не истек. Но по какой-то причине [Authorize] помечает его как просроченный