【问题标题】:.NET Core - JWT - SecurityTokenNoExpirationException.NET Core - JWT - SecurityTokenNoExpirationException
【发布时间】:2021-01-17 22:36:38
【问题描述】:

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

中间件抛出异常:

SecurityTokenNoExpirationException

非常确定一切就绪。

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

这是创建 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();

这里是初始化 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
    };
});

如果您需要更多信息,请告诉我。

感谢您在这方面帮助我。

【问题讨论】:

    标签: c# asp.net-core exception jwt


    【解决方案1】:

    JWT 中的时间戳在UNIX epoch time 中表示为秒,而不是毫秒。

    RFC7519 定义数字日期:

    一个 JSON 数值,表示从 1970-01-01T00:00:00Z UTC 到指定 UTC 日期/时间的秒数,忽略闰秒。

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

    【讨论】:

    • 我会检查一下,但我意识到未发送承载...我发布了一个角度问题...stackoverflow.com/questions/64169600/…
    • 对于 Angular 问题无能为力,但我想知道为什么您会遇到这样一个特定的异常,而您根本没有发送令牌?但无论如何,只要您发送令牌,您就会发现错误的时间戳格式是下一个问题。而且我认为您还应该在TokenValidationParameters中添加ValidateLifetime = true
    • 是的,我会验证你的答案
    猜你喜欢
    • 2019-01-21
    • 2018-01-22
    • 2020-06-04
    • 2018-12-21
    • 2018-07-26
    • 2021-06-27
    • 2018-11-28
    • 2020-08-10
    • 2021-06-17
    相关资源
    最近更新 更多