C# .NET对JWT的索赔?
我正在确定将.NETC# .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指示将值转换为适当的实例,除非出现大的丑陋案例语句 想法?丑陋的大案子/如果是这样的话。我刚刚实现了最低限度,并将根据需要添加
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。