2015-12-05 7 views
5

Es scheint mir, dass ich einen benutzerdefinierten Anspruch (der benutzerspezifisch ist) nicht zu der Antwort meines ersten Aufrufs von Identity Server hinzufügen kann. Kann jemand diese Annahme bestätigen?Ich suche Bestätigung, dass IdentityServer 3 benutzerdefinierte Ansprüche ohne zweiten Aufruf an Server nicht unterstützt

Hier ist, was wir in unserer App tun: Mit ResourceOwner Flow ruft unsere Web-Anwendung (Server-Seite) Identity Server an und sendet die Anmelde-ID und das Passwort und die Bereiche des Benutzers.

Wir erhalten eine JWT zurück, die die Standardansprüche wie sub, idp, client_id enthält; aber wir würden gerne noch eins hinzufügen. Um es zu vereinfachen, nehmen wir an, dass ein zusätzlicher Anspruch die E-Mail-Adresse des Benutzers ist.

Es scheint, dass wir den Identity Server erneut anrufen und ein neues Token erhalten müssen. Ist das korrekt? Gibt es einen Weg, wie wir diesen Wert beim ersten Anruf erhalten können?

Antwort

4

Entschuldigung, dass ich meine eigene Frage beantworte, aber ich habe herausgefunden, wie das funktioniert.

  1. Erstellen Sie einen benutzerdefinierten Bereich. Stellen Sie sicher, dass Type = ScopeType.Resource und IncludeAllClaimsForUser = false sind, und fügen Sie dem Bereich eine Auflistung von Ansprüchen hinzu, und legen Sie den zweiten Parameter von ScopeClaim auf true fest.
  2. Fügen Sie den benutzerdefinierten Bereich Ihrem Client hinzu.
  3. Stellen Sie in Ihrer IUserService-Überschreibung in AuthenticateLocalAsync sicher, dass der Benutzer.Claims als dritter Parameter im Aufruf von AuthenticateResult übergeben wird.
  4. In Ihrer IUserService Überschreibung in GetProfileDataAsync fügen Sie den folgenden Code ein:

    if (context.RequestedClaimTypes != null) 
    { 
        List<Claim> newclaims = new List<Claim>(); 
        foreach (Claim claim in context.Subject.Claims) 
        { 
         if (context.RequestedClaimTypes.Contains(claim.Type)) 
         { 
          newclaims.Add(claim); 
         } 
        } 
        context.IssuedClaims = newclaims; 
    } 
    return Task.FromResult(context.IssuedClaims); 
    
  5. Schließlich, um sicherzustellen, dass GetProfileDataAsync jedes Mal der Benutzer anmeldet, nicht nur das erste Mal feuert, sicher, dass Sie tun Caching nicht aktiviert. Dies bedeutet wahrscheinlich das Entfernen einer Codezeile in Ihrem Start, die wie folgt aussieht: factory.ConfigureUserServiceCache().