6.27JwtTokenUtility 与 DigestCredentials

JwtTokenUtility 是一个轻量级的 JWT 实用工具类,无需依赖外部 JWT 库即可解析 JWT 的 Payload 部分并提取常见的声明(Claims),适用于需要快速获取 JWT 中过期时间、签发者、主题等信息的场景。

JwtTokenUtility 解析 JWT Token#

JwtTokenUtility 是一个轻量级的 JWT 实用工具类,无需依赖外部 JWT 库即可解析 JWTPayload 部分并提取常见的声明(Claims),适用于需要快速获取 JWT 中过期时间、签发者、主题等信息的场景。

解析 JWTPayload

通过 JwtTokenUtility.Parse 方法可以解析完整 JWT 字符串或单独的 Payload 片段,返回一个 JwtPayload 实例:

cs
var jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";var jwtPayload = JwtTokenUtility.Parse(jwt);// 获取过期时间(UTC)var exp = jwtPayload.GetExpirationTimeUtc();

Parse 方法内部会自动处理标准 Base64Url 编码并补齐 =,无需手动处理。

读取标准声明

JwtPayload 提供了完整的标准 JWT 声明读取方法:

cs
var jwtPayload = JwtTokenUtility.Parse(jwt);string? issuer = jwtPayload.GetIssuer();       // issstring? subject = jwtPayload.GetSubject();     // substring? audience = jwtPayload.GetAudience();   // audlong? expiration = jwtPayload.GetExpiration(); // exp (Unix 秒)long? issuedAt = jwtPayload.GetIssuedAt();     // iat (Unix 秒)long? notBefore = jwtPayload.GetNotBefore();   // nbf (Unix 秒)string? jwtId = jwtPayload.GetJwtId();         // jti// 更多便捷方法...

检查 JWT 是否过期或有效

cs
// 是否已过期bool expired = jwtPayload.IsExpired();// 是否当前有效(已生效且未过期)bool active = jwtPayload.IsActive();

读取自定义声明

除了标准声明,JwtPayload 还支持读取任意自定义声明的值:

cs
var jwtPayload = JwtTokenUtility.Parse(jwt);// 读取字符串声明string? name = jwtPayload.GetString("name");// 读取整数声明int? age = jwtPayload.GetInt32("age");long? timestamp = jwtPayload.GetInt64("timestamp");// 检查是否存在某声明bool hasEmail = jwtPayload.Contains("email");

获取原始 JSON 字符串

JwtPayload 对象暴露了原始 JSON 字符串,方便进行自定义解析:

cs
var jwtPayload = JwtTokenUtility.Parse(jwt);string rawJson = jwtPayload.RawJson;

Access Token 管理结合使用

该工具常用于 FurionAccessTokenProvider 中,从服务端返回的刷新令牌中解析过期时间并更新 HttpAccessTokenExpiresAt

cs
// 在 Configure 方法的响应后回调中httpRequestBuilder.SetOnPostReceiveResponse(httpResponseMessage =>{    var newRefreshToken = httpResponseMessage.Headers.GetValues("x-access-token").FirstOrDefault();    if (!string.IsNullOrWhiteSpace(newRefreshToken))    {        httpAccessToken.ExpiresAt = JwtTokenUtility.Parse(newRefreshToken).GetExpirationTimeUtc()!.Value;    }});

通过 JwtTokenUtility,您可以轻松地解析 JWT、提取声明并进行有效性判断,无需引入笨重的第三方 JWT 库,尤其适合在客户端侧或轻量级 SDK 中使用。

DigestCredentials 摘要身份认证#

Digest 摘要身份认证是一种在 HTTP 协议中用于验证用户身份的增强安全性的方法,相较于基本的 HTTP Basic 认证,它更为安全。在 Digest 认证过程中,用户的密码不会以明文形式在网络上传输,而是通过加密处理后再发送,从而提升了安全性。框架提供了 DigestCredentials 类型,便于生成摘要授权凭证:

cs
// 向指定服务器发起请求,并生成摘要认证所需的授权凭证字符串var digestCredentials = DigestCredentials.GetDigestCredentials("https://furion.net/digest", "admin", "a123456789", HttpMethod.Get);// 将生成的授权凭证字符串设置为 Authorization 请求标头的值httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Digest", digestCredentials);// 再次发起请求

这样,通过 DigestCredentials 类型,可以方便地实现 Digest 摘要身份认证,确保用户身份的安全验证。