2014-12-03 43 views
7

Korzystając z cienkowarstwowego przepływu właściciela zasobu uwierzytelniania JWT, używam części oświadczeń JWT do konsumpcji klienta. Moje pytanie jest takie, że jeśli jest możliwe dodanie roszczenia do serwera tożsamości i dekodowanie go jako tablicy w kliencie.Dodać roszczenie do JWT jako tablicy?

Dla Typ tablicy nie ma wartości ClaimTypeValues.

Jako obejście,

var user = IdentityServerPrincipal.Create(response.UserName, response.UserName); 
       user.Identities.First().AddClaims(
              new List<Claim>() 
             { 
              new Claim(ClaimTypes.Name, response.UserName), 
              new Claim(ClaimTypes.Email, response.Email), 
              new Claim(FullName, response.FullName), 
              new Claim(AuthorizedCompanies,JsonConvert.SerializeObject(response.AuthorizedCompanies)) 
             }); 
       return new AuthenticateResult(user); 

dodam roszczenia jako tablicy json zastrzeżenia do AuthorizedCompanies i przetwarza go w side.What klienta jest tutaj projekt wzór ewentualnych?

Odpowiedz

11

Mówiąc z własnego doświadczenia, łatwiej jest współdziałać z magazynami skarg, gdy ValueType jest zawsze typu "String". Chociaż może wydawać się sprzeczne z intuicją, gdy wiesz, że masz do czynienia ze złożonym typem, jest to przynajmniej łatwe do zrozumienia.

sposób mam zbliżył tę potrzebę za tablicą jest mieć mój kod aplikacji oczekiwać wielu twierdzi, że jest obecny rodzaju roszczenia, o którym mowa, i zachować każdą wartość roszczenia prostego typu.

examp:

var authorizeCompanies = identity.FindAll(AuthorizedCompanies).Select(c => c.Value); 

I oczywiście, można również dodawać je w ten sposób:

identity.AddClaim(ClaimTypes.Name, response.UserName); 
identity.AddClaim(AuthorizedCompanies, "CompanyX"); 
identity.AddClaim(AuthorizedCompanies, "CompanyY"); 
identity.AddClaim(AuthorizedCompanies, "CompanyZ"); 

IdentityServer obsługuje tego modelu po wyjęciu z pudełka. Podczas generowania tokena dla tożsamości takiej jak ta, automatycznie zapisuje wartości tego roszczenia jako tablicę.

{ 
    "aud": "Identity Server example/resources", 
    "iss": "Identity Server example", 
    "exp": 1417718816, 
    "sub": "1234", 
    "scope": ["read", "write"], // <-- HERE 
    "foo": ["bar", "baz"],  // <-- HERE TOO! 
    "nbf": 1417632416 
} 

Takie podejście do roszczeń jest sprzeczne z założeniem, że wszystkie roszczenia są odwzorowaniem typu "jeden do jednego" typu -> wartości.