c# - .NET Core - JWT - SecurityTokenNoExpirationException

标签 c# asp.net-core exception jwt

登录页面的上下文中,我尝试在.NET Core中构建Jwt token

中间件抛出异常:

SecurityTokenNoExpirationException

很确定一切都已就位。

我关注了:https://www.youtube.com/watch?edufilter=NULL&ab_channel=IAmTimCorey&v=9QU_y7-VsC8

这是创建 JWT 的身份验证 Controller 部分:

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 中间件的startup.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 epoch time 中表示为秒,而不是毫秒。

RFC7519定义数字日期:

A JSON numeric value representing the number of seconds from 1970-01-01T00:00:00Z UTC until the specified UTC date/time, ignoring leap seconds.

因此,在创建声明时,请使用 ToUnixTimeSeconds() 而不是 ToUnixTimeMilliseconds()

关于c# - .NET Core - JWT - SecurityTokenNoExpirationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64168351/

相关文章:

c# - C# 中的 MongoDB 复合条件

c# - 如何将 SameSite cookie 属性设置为显式 None ASP NET Core

iphone - iOS - 使用关联时出现 "This class is not key value coding-compliant"?

javascript - 加载时修改模态窗口中的数据

java.net.SocketException : Software caused connection abort: recv failed; Causes and cures? 异常

java - 我的类中的removeListing()方法抛出空指针异常

c# - 使用 C# 在 Excel 图表上显示标签

c# - 使用自动映射器将复杂的 DTO 映射到实体

c# - 将项目添加到下拉列表

c# - 如何使用 dotnetcore 命令行生成 Controller