.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语句。
想法?
这是一个丑陋的大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();
}
}