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解码

浙公网安备 33010602011771号