我正在关注有关微服务的教程。我明白了将承载令牌用于基本授权模型。我创建了令牌并设置了所有属性,但是当我尝试使用令牌时,它给了我错误:Bearer error="invalid_token", error_description="The token expired at '04/03/2020 21:47:31'"
甚至是当前的21:42,因此它实际上没有过期。
我只是检查以下网址:https://localhost:5001/api/Activities/GetActivity
邮递员是否有问题,我已经尝试过更改发行者,添加了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
};
}
答案 0 :(得分:1)
可能的问题是您使用的centuryBegin
不是UTC时代-DateTime
构造函数默认假定其Kind
为DateTimeKind.Unspecified
,并调用{{ 1}}不会改变.NET假定它代表您当地时区1970年1月1日的时间实例的事实。
因此,为了正确表示纪元,您应该使用:
ToUniversalTime()
或者,您可以改用var centuryBegin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
类,因为它更适合表示绝对时间,并且它还具有便捷的方法DateTimeOffset
:
DateTimeOffset.ToUnixTimeSeconds()