【发布时间】:2020-07-30 10:05:45
【问题描述】:
这是我的 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
这是我的令牌示例。它使用我的密钥验证成功,并且显示的到期日期正确且未过期:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJQaG9uZU51bWJlciI6IjEyMzIxMjMxMjMiLCJuYmYiOjE1ODcwNTAxOTksImV4cCI6MTU4NzkxNDE5OSwiaWF0IjoxNTg3MDUwMTk5LCJpc3MiOiJTUiIsImF1ZCI6IlNSIn0.WbEJq_PAOLvra1ZUwtQEKH9FRBDdb2byw26miUm-K-E P>
编辑:
当我尝试手动验证令牌时,它验证成功并且没有过期。但是由于某种原因,[Authorize] 将其标记为已过期
【问题讨论】:
-
有时问题可能是 ValidateLifetime = true,尝试将其设为 false 并尝试。
-
ValidateLifetime = 假作品。但是,我需要知道为什么将其设置为 true 不起作用?
标签: c# asp.net-core .net-core jwt