C# .NET对JWT的索赔?

C# .NET对JWT的索赔?,c#,asp.net,jwt,claims-based-identity,C#,Asp.net,Jwt,Claims Based Identity,我正在确定将.NETClaimsIdentity中的Claims列表转换为JSON Web令牌()的最佳实践。如果我试图直接在JsonWebToken.Encode()中使用Claims列表,我会得到一个循环引用异常 我的第一个想法是把它转换成一本字典。挑战在于将字符串Claim.Value转换为适当的类型实例。看起来没有任何好的方法可以使用ClaimValueTypes指示将值转换为适当的实例,除非出现大的丑陋案例语句 想法?丑陋的大案子/如果是这样的话。我刚刚实现了最低限度,并将根据需要添加

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

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


想法?

丑陋的大案子/如果是这样的话。我刚刚实现了最低限度,并将根据需要添加案例。不幸的是,
ClaimValueTypes

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();

    } 
}
公共静态类ClaimExtensions
{
公共静态对象ValueAsValueType(此声明)
{
开关(claim.ValueType)
{
案例索赔价值类型。双重:
返回double.Parse(claim.Value);
案例ClaimValueTypes.String:
返回索赔。价值;
违约:
抛出新异常(string.Format(“ClaimExtensions.ValueAsValueType()中未处理的ClaimValueType{0}”,claim.ValueType));
}
}
公共静态列表ToClaims(此字典负载)
{
返回有效负载。选择(x=>
{
字符串值类型;
var值=x.值;
如果(x.值为双精度| | x.值为十进制)
valueType=ClaimValueTypes.Double;
else if(x.Value为字符串)
valueType=ClaimValueTypes.String;
其他的
抛出新异常(string.Format(“ClaimExtensions.ToClaims()中声明值{0}的未处理类型”,Value.GetType());
返回新声明(x.Key,x.Value.ToString(),valueType);
}).ToList();
} 
}

不过,您应该能够创建自己的ClaimValueType。