0

Ich benutze IdentityServer4 mit Net Core. Ich kann mit Google, Facebook, Twitter, LinkedIn und Microsoft authentifizieren, aber jetzt möchte ich das Profilbild des Benutzers den externen Anbieter erhalten. Ich verwende einen Client mit GrantTypes.Implicit und haben versucht, eine neue IdentityResource Zugabe wie folgt:Wie bekomme ich Profilbilder von externen Providern mit identityserver4?

new IdentityResource { 
    Name = "picture", 
    UserClaims = new List<string> {"picture" } 
} 

Ich habe dann „Bild“ als erlaubtes Rahmen für meine Kunden. Dies ist alles nur ein Schuss in die Dunkelheit, während ich immer noch versuche, meinen Kopf um Identitätsressourcen und erlaubte Bereiche zu wickeln.

Da ich bin sehr neu zu identityserver4, sei freundlich und werde so detailliert wie möglich. Danke im Voraus!

Antwort

0

Es sollte bereits "Geltungsbereich" in der Identity Resources namens "Profil" mit einer Reihe von Benutzeransprüchen sein - einer davon ist "Bild".

Da Sie ASP.NET Identity verwenden, müssen Sie einen Datensatz für einen bestimmten Benutzer in die AspNetUserClaims-Tabelle mit dem Anspruchstyp "Bild" einfügen, wobei der Wert die URL des Online-Abbilds ist.

Clients, die den Bereich "Profil" erhalten haben, sollten diesen "Bild" -Anspruch erhalten, wenn sie eine Anfrage an den UserInfo-Endpunkt stellen.

Wenn Sie dieses Bild als Teil von id_token erstellen möchten, müssen Sie zusätzlich zum Bereich "scope/resource" für "profile" den Anspruch "picture" zum Bereich "openid" hinzufügen.

(Die Begriffe Umfang und Ressourcen Mischung zusammen ein wenig in Identity Server-Datenmodell.)

-

Um das Bild Anspruch von Google erhalten Sie dies tun können:

info.Principal.Claims.Where(x => x.Type == "picture").Select(x => x.Value).FirstOrDefault() 

-

Wenn Sie Microsoft.AspNetCore.Authentication.Google verwenden, z. B. app.UseGoogleAuthentication(google.Options(externalCookieScheme), sendet Google den Bildanspruch nicht.

Wenn Sie zur OIDC-Methode wechseln, sendet Google Ihnen den Bildnachweis.

 app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
     { 
      AuthenticationScheme = "oidc-google", 

      DisplayName = "Google", 
      Authority = "https://accounts.google.com", 
      ClientId = "", 
      ClientSecret = "", 
      Scope = { "profile", "email", "openid" }, 
      CallbackPath = "signin-google", 
      TokenValidationParameters = new TokenValidationParameters 
      { 
       NameClaimType = "name", 
       RoleClaimType = "role", 
       ValidateIssuer = false 
      } 
     }); 
+0

Ich habe die "Profil" -Ressource hinzugefügt und kann den Namen des Benutzers, E-Mail-Adresse und URL-Profil erhalten, kann aber nicht das Bild bekommen. Es ist nicht in den Ansprüchen zurück von Google enthalten. In meiner ExternalLoginCallback-Methode habe ich folgendes: 'var email = info.Principal.FindFirstValue (ClaimTypes.Email); var picture = info.Principal.FindFirstValue ("Bild"); ' Die E-Mail wird zurückgegeben, aber nicht das Bild. – 206mph

+0

info.Principal.Claims.Where (x => x.Type == "Bild"). Wählen Sie (x => x.Value) .FirstOrDefault() –

+0

Das ist das gleiche wie die Verwendung des FindFirstValue. Leider enthalten die Ansprüche nicht das Bild. Ich bin mir nicht sicher, warum nicht. Muss ich irgendetwas mit dem GoogleOptions-Objekt tun, um Google anzuweisen, das Bild aufzunehmen? Ich dachte 'new IdentityResources.Profile()' in der Liste der identityresources ist alles was benötigt wird, aber anscheinend nicht. – 206mph

Verwandte Themen