NET JWT设置时钟偏差

背景

多台服务器时间没有自动同步或延迟,颁发令牌服务器的时间 比 鉴权令牌服务器时间 晚,导致jwt解密失败

netframework & jwt 8.2.3

using JWT;
using JWT.Algorithms;
using JWT.Builder;
using JWT.Exceptions;
using JWT.Serializers;


// 设置时钟偏差(例如5分钟,转换为秒)
int timeMargin = (int)TimeSpan.FromMinutes(1).TotalSeconds;
var claims = JwtBuilder.Create()
    .WithAlgorithm(new RS256Algorithm(secret))    // asymmetric
    .MustVerifySignature()

    //    配置验证参数,包括时钟偏差
    .WithValidator(new JwtValidator(new JsonNetSerializer(), new UtcDateTimeProvider(), timeMargin))

    .Decode<T>(token);

net6 & jwt10.1.1

using JWT.Algorithms;
using JWT.Builder;
using JWT.Exceptions;
using JWT;
using JWT.Serializers;


var path = $@"{AppDomain.CurrentDomain.BaseDirectory}\sso_pub_key.txt";
var secret = new X509Certificate2(path);

// 1. 创建JSON序列化器(JWT库默认实现)
IJsonSerializer jsonSerializer = new JsonNetSerializer();

// 2. 创建日期时间提供器
IDateTimeProvider dateTimeProvider = new UtcDateTimeProvider();

// 3. 配置验证参数,设置时钟偏差
var validationParameters = new ValidationParameters
{
    // 设置允许的时钟偏差(30秒)
    TimeMargin = 30
    // 可根据需要添加其他验证参数
    // ValidateIssuer = true,
    // ValidIssuer = "your-issuer",
    // ValidateAudience = true,
    // ValidAudience = "your-audience"
};

// 4. 创建Base64URL编码器(可选,可为null)
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();

// 5. 实例化JwtValidator,完全匹配构造函数参数
IJwtValidator validator = new JwtValidator(
    jsonSerializer,
    dateTimeProvider,
    validationParameters,
    urlEncoder
);

// 设置时钟偏差(例如5分钟,转换为秒)
//int timeMargin = (int)TimeSpan.FromMinutes(1).TotalSeconds;
var claims = JwtBuilder.Create()
    .WithAlgorithm(new RS256Algorithm(secret))    // asymmetric
    .MustVerifySignature()
    // 替换默认的时间验证器,应用时钟偏差
    .WithValidator(validator)

    .Decode(token);  // ToString

 

Online Web Link:

时间戳和时间互转
在线jwt解码
posted @ 2025-08-22 17:11  Robot-Blog  阅读(17)  评论(0)    收藏  举报