.NET声明JWT的标识

本文关键字:标识 JWT 声明 NET | 更新日期: 2023-09-27 18:19:44

我正在确定将.NET ClaimsIdentity中的Claims列表转换为JSON Web令牌的最佳实践(https://github.com/jwt-dotnet/jwt)。如果我尝试在JsonWebToken.Encode()中直接使用Claims列表,我会得到一个循环引用异常。

我的第一个想法是把它转换成Dictionary<string,object>。挑战在于将字符串Claim.Value转换为适当的类型实例。看起来没有任何好的方法可以使用ClaimValueTypes指示将Value转换为适当的实例,除非有一个大而丑陋的case语句。

想法?

.NET声明JWT的标识

这是一个丑陋的大case/if语句。我刚刚实现了最简单的方法,并将根据需要添加case。不幸的是,ClaimValueTypes 中没有Decimal类型

public static class ClaimExtensions
{
    public static object ValueAsValueType(this Claim claim)
    {
        switch (claim.ValueType)
        {
            case ClaimValueTypes.Double:
                return double.Parse(claim.Value);
            case ClaimValueTypes.String:
                return claim.Value;
            default:
                throw new Exception(string.Format("Unhandled ClaimValueType {0} in ClaimExtensions.ValueAsValueType()", claim.ValueType));
        }
    }
    public static List<Claim> ToClaims(this Dictionary<string, object> payload)
    {
        return payload.Select(x =>
        {
            string valueType;
            var value = x.Value;
            if (x.Value is double || x.Value is decimal)
                valueType = ClaimValueTypes.Double;
            else if (x.Value is string)
                valueType = ClaimValueTypes.String;
            else
                throw new Exception(string.Format("Unhandled type of Claim Value {0} in ClaimExtensions.ToClaims()", value.GetType()));
            return new Claim(x.Key, x.Value.ToString(), valueType);
        }).ToList();
    } 
}