2015-10-28 4 views
0

Я свяжусь, чтобы определить наилучшую практику для преобразования списка Claims в .NET ClaimsIdentity в веб-токен JSON (https://github.com/jwt-dotnet/jwt). Если я попытаюсь использовать список Claims непосредственно в JsonWebToken.Encode(), я получаю исключение для круговой ссылки..NET ClaimsIdentity для JWT?

Моя первая мысль состояла в том, чтобы преобразовать его в Dictionary<string,object>. Задача состоит в том, чтобы преобразовать строку Claim.Value в соответствующий экземпляр типа. Не похоже, что есть хороший способ использовать показания ClaimValueTypes для преобразования Value в соответствующие экземпляры, за исключением большого уродливого оператора case.

Мысли?

ответ

0

Большой уродливый футляр/если заявление это. Я просто выполнил минимальный минимум и добавлю случаи по мере необходимости. К сожалению, нет Decimal в 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(); 

    } 
} 
Смежные вопросы