.net core 我的jwt承载令牌返回错误=";无效的“U令牌”;,错误描述=";代币过期了;和邮递员

.net core 我的jwt承载令牌返回错误=";无效的“U令牌”;,错误描述=";代币过期了;和邮递员,.net-core,jwt,postman,.net Core,Jwt,Postman,我正在学习有关微服务的教程。我开始使用承载令牌作为基本授权模型。我创建了令牌并设置了所有属性,但是当我尝试使用令牌时,它会给我一个错误:Bearer error=“invalid\u token”,error\u description=“该令牌在'04/03/2020 21:47:31'过期”即使它当前的时间是21:42,所以它实际上也没有过期 我正在检查此url: 这可能是邮递员的问题,我已经尝试更改发行人,添加了超过5分钟,为邮递员添加了更多的标题,但没有运气 这是我创建令牌的函数: p

我正在学习有关微服务的教程。我开始使用承载令牌作为基本授权模型。我创建了令牌并设置了所有属性,但是当我尝试使用令牌时,它会给我一个错误:
Bearer error=“invalid\u token”,error\u description=“该令牌在'04/03/2020 21:47:31'过期”
即使它当前的时间是21:42,所以它实际上也没有过期

我正在检查此url:

这可能是邮递员的问题,我已经尝试更改发行人,添加了超过5分钟,为邮递员添加了更多的标题,但没有运气

这是我创建令牌的函数:

 public CustomJsonWebToken Create(Guid userId)
        {
            var nowUtc = DateTime.UtcNow;
            var expiration = nowUtc.AddMinutes(jwtOptions.ExpiryMinutes);
            var centuryBegin = new DateTime(1970, 1, 1).ToUniversalTime();
            var exp = (long)(new TimeSpan(expiration.Ticks - centuryBegin.Ticks).TotalSeconds);
            var now = (long)(new TimeSpan(nowUtc.Ticks - centuryBegin.Ticks).TotalSeconds);
            var payload = new JwtPayload
            {
                {"sub", userId},
                {"iss", jwtOptions.Issuer},
                {"iat", now},
                {"exp", exp},
                {"unique_name", userId}
            };
            var jwt = new JwtSecurityToken(jwtHeader, payload);
            var token = jwtSecurityTokenHandler.WriteToken(jwt);

            return new CustomJsonWebToken
            {
                Token = token,
                Expire = exp
            };
        }

可能的问题是您使用的
centuryBegin
不是UTC纪元-默认情况下
DateTime
构造函数假定其
Kind
DateTimeKind.Unspecified
,并调用
ToUniversalTime()
不会改变.NET假定它代表本地时区1970年1月1日的时间实例这一事实

因此,为了正确表示纪元,您可能应该使用:

var centuryBegin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
或者,您也可以使用
DateTimeOffset
类,因为它更适合表示绝对时间,并且它还有方便的方法
DateTimeOffset.ToUnixTimeSeconds()


非常感谢,伙计,它工作得很好,我不知道那门课,我有很多东西要学!非常感谢。只是一个问题,你介意告诉我使用ToUnixSeconds而不是只使用nowUtc.AddMinutes(jwtOptions.ExpiryMinutes)有什么好处吗;作为到期时间?@Teler
ToUnixTimeSeconds
只需减去两次即可获得Unix时间戳。您仍然需要
nowtutc.AddMinutes(jwtOptions.ExpiryMinutes)
首先创建过期时间。有关
DateTime
vs
DateTimeOffset
的详细讨论,请参见Microsoft文档
var nowUtc = DateTimeOffset.UtcNow;
var expiration = nowUtc.AddMinutes(jwtOptions.ExpiryMinutes);
var exp = expiration.ToUnixTimeSeconds();
var now = nowUtc.ToUnixTimeSeconds();