.NET Core - JWT - SecurityTokenNoExpirationException
Trong ngữ cảnh của trang đăng nhập , tôi cố gắng tạo mã thông báo Jwt trong .NET Core .
Phần mềm trung gian đang ném một ngoại lệ:
SecurityTokenNoExpirationException
Khá chắc chắn rằng mọi thứ đã vào đúng vị trí.
Tôi đã làm theo: https://www.youtube.com/watch?edufilter=NULL&ab_channel=IAmTimCorey&v=9QU_y7-VsC8
đây là phần điều khiển xác thực tạo 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();
đây là phần startup.cs khởi tạo phần mềm trung gian JWT:
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
};
});
Hãy cho tôi biết nếu bạn cần thêm thông tin.
Cảm ơn vì đã giúp tôi về điều này.
Trả lời
Dấu thời gian trong JWT được biểu thị dưới dạng giây trong thời gian kỷ nguyên UNIX , không phải là mili giây.
RFC7519 xác định ngày số:
Giá trị số JSON đại diện cho số giây từ 1970-01-01T00: 00: 00Z UTC cho đến ngày / giờ UTC được chỉ định, bỏ qua giây nhuận.
Do đó, hãy sử dụng ToUnixTimeSeconds()thay vì ToUnixTimeMilliseconds()khi bạn tạo xác nhận quyền sở hữu.