2016-04-19 5 views
0

Ich versuche, den Identityserver einzurichten, um mich mit Facebook einzuloggen. Alles funktioniert gut, außer ich kann keine der Benutzerinformationen von Facebook abrufen. Die mvc App wird erwartet, ein Vorname und Nachname Anspruch. Ich habe public_profile einen Bereich hinzugefügt, bekomme ihn aber nicht zurück.Externe Anmeldung mit Identity Server 3 - Festlegen des Vornamens von Facebook

Nach vielen Nachforschungen scheint es, als müsste ich einen UserService einrichten, bin aber nicht sicher, wie ich das machen soll.

Hilfe wäre sehr willkommen.

Hier sind mein Code den externen Anbieter im statup der idenity Server-Anwendung zu konfigurieren:

private void ConfigureIdenityProviders (IAppBuilder app, string signInAsType) 
    { 

     var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions 
     { 
      AuthenticationType = "Facebook", 
      Caption = "Sign in with Facebook", 
      SignInAsAuthenticationType = signInAsType, 
      AppId = "xxxxxxxxxxxx", 
      AppSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 



      Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider() 
      { 
       OnAuthenticated = (context) => 
       { 

        // Problem here - there is no last_name returned 
         JToken lastname; 
        if (context.User.TryGetValue("last_name", out lastname)) 
        { 
         context.Identity.AddClaim(new System.Security.Claims.Claim(IdentityServer3.Core.Constants.ClaimTypes.FamilyName, lastname.ToString())); 
        } 

        context.Identity.AddClaim(new System.Security.Claims.Claim("role", "Guest")); 

        return Task.FromResult(0); 

       } 

      } 
     }; 

     facebookOptions.Scope.Add("public_profile"); 
     facebookOptions.Scope.Add("email"); 


     app.UseFacebookAuthentication(facebookOptions); 

    } 

Antwort

0

Ich habe gerade die Facebook-Grafik verwendet, um das Benutzerprofil zu erhalten.

Ein Benutzer-Service kann eine andere Möglichkeit sein, es zu tun, aber das funktioniert für mich.

using (var client = new HttpClient()) 
        { 
         var result = client.GetAsync("https://graph.facebook.com/me?fields=first_name,last_name&access_token=" + context.AccessToken).Result; 


         if (result.IsSuccessStatusCode) 
         { 
          var userInformation = result.Content.ReadAsStringAsync().Result; 
          var fbUser = JsonConvert.DeserializeObject<FacebookUser>(userInformation); 
          context.Identity.AddClaim(new System.Security.Claims.Claim(IdentityServer3.Core.Constants.ClaimTypes.GivenName, fbUser.first_name)); 
          context.Identity.AddClaim(new System.Security.Claims.Claim(IdentityServer3.Core.Constants.ClaimTypes.FamilyName, fbUser.last_name)); 
          context.Identity.AddClaim(new System.Security.Claims.Claim("role", "Guest")); 
         } 

        } 
0

Alle Ansprüche Ihnen von Facebook zurück entlang zu Ihrem benutzerdefinierten Dienst AuthenticateExternal Methode übergeben werden. An diesem Punkt sind sie deine Ansprüche zu tun, was auch immer du willst.

Wenn Sie nicht die Ansprüche erhalten, die Sie von Facebook wollen, würde ich vorschlagen, eine eigenständige MVC-App zu erstellen, um dieses Problem zuerst zu lösen.

0

Sie werden nicht Zugriffstoken von FB erhalten, wenn Sie Ihren Provider ändern, wie

OnAuthenticated = context => 
       { 
context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken)); 
return Task.FromResult(true); 
    } 

folgt Nachdem Sie die Token-Nutzung Aufruf fb mit dem Token und erhalten die GIVEN_NAME

bekommen
Verwandte Themen