2017-04-26 1 views
0

Ich habe einen kleinen IdentityServer-Demo-Server geschrieben, der den Beispielen in der Dokumentation folgt. Ich habe folgende TestUser:IdentitySever4 Benutzeransprüche und ASP.NET User.Identity

new TestUser 
{ 
    SubjectId = "1", 
    Username = "Username", 
    Password = "password", 
    Claims = new List<Claim>() 
    { 
     new Claim(System.Security.Claims.ClaimTypes.Name, "Username"), 
     new Claim(System.Security.Claims.ClaimTypes.Email, "[email protected]") 
    } 
} 

Ich erhalte eine Zugriffstoken mit ResourceOwnerPassword Flow. Und ich bin berechtigt, auf meine API zuzugreifen.

Das Problem ist, dass, wenn ich in meiner geschützten API versuche, die Benutzeridentität zu erhalten, die Name-Eigenschaft als null zurückgegeben wird, und ich sehe nicht die E-Mail-Anspruch. Egal was ich mache, ich sehe immer die gleichen 12 Ansprüche. Der Anspruch sub ist der einzige mit den Informationen, die ich in das Objekt Client eingegeben habe.

Wie kann ich die HttpContext.User.Identity.Name Eigenschaft ausfüllen und zusätzliche Ansprüche/Daten über den Benutzer senden?

Antwort

4

Der Grund ist wahrscheinlich, dass Sie nicht die richtigen Ressourcen/Bereiche für Ihren Client anfordern.

  1. Sie müssen eine API-Ressource mit den Ansprüchen definieren, die Sie im Zugriffstoken benötigen.

zB in Resources.cs Sie die Ansprüche hinzufügen können in allen api2 Tive

 new ApiResource 
      { 
       Name = "api2", 

       ApiSecrets = 
       { 
        new Secret("secret".Sha256()) 
       }, 

       UserClaims = 
       { 
        JwtClaimTypes.Name, 
        JwtClaimTypes.Email 
       }, 

       Scopes = 
       { 
        new Scope() 
        { 
         Name = "api2.full_access", 
         DisplayName = "Full access to API 2", 
        }, 
        new Scope 
        { 
         Name = "api2.read_only", 
         DisplayName = "Read only access to API 2" 
        } 
       } 
      } 
    aufgenommen werden
  1. Dann lassen Sie den Zugriff auf diejenigen, Ihre Client-Ressource Besitzer API-Ressourcen.

zB in Client.cs

 new Client 
      { 
       ClientId = "roclient", 
       ClientSecrets = 
       { 
        new Secret("secret".Sha256()) 
       }, 

       AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, 

       AllowOfflineAccess = true, 
       AllowedScopes = 
       { 
        IdentityServerConstants.StandardScopes.OpenId, 
        "custom.profile", 
        "api1", "api2.read_only" 
       } 
      }, 
  1. Sie können dann den Rahmen in Ihrem roclient anfordern

    client.RequestResourceOwnerPasswordAsync("bob", "bob", "api2.read_only", optional).Result 
    
  2. Schreiben Sie die Zugriffstoken Die API und Sie erhalten die Ansprüche, die Sie Ihrer API-Ressource hinzugefügt haben.

enter image description here

0

In dem Aufruf an UseOpenIdConnectAuthentication oder wo immer Sie versuchen, das Token zu verwenden, stellen Sie sicher, dass Sie die TokenValidationParameters für die Eigenschaft Name zu ClaimTypes.Name festlegen.

Standardmäßig ist der Anspruchstyp Name auf name (JwtClaimType.Name) eingestellt. enter image description here

+0

Ich verstehe nicht, wo diese setzen. Auf der API-Seite? auf der Auth Server Seite? – developer82

+0

Nur zur Klarstellung, ich richte Identity-Server wie folgt ein: 'app.UseIdentityServer();' – developer82

+0

Ich fand, dass wenn ich auf meiner API die Optionen für 'UseIdentityServerAuthentication' auf' NameClaimType = "sub" 'Ich bin den Namen mit dem Inhalt meines Themas füllen. Das Problem besteht also darin, dass die Ansprüche, die ich an den Benutzer sende, nicht in der API wiedergegeben werden. – developer82

Verwandte Themen