Comment accéder à Facebook des informations privées en utilisant ASP.NET Identité (OWIN)?
Je suis en train d'élaborer un site web dans ASP.NET MVC 5 (en utilisant la version RC1 actuellement). Le site utilise Facebook pour l'authentification de l'utilisateur et pour l'extraction initiale des données de profil.
Pour le système d'authentification, je suis en utilisant le nouveau OWIN base ASP.NET l'Identité moteur (http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx), car il simplifie grandement le processus d'authentification avec les fournisseurs externes.
Le problème est qu'une fois qu'un utilisateur se connecte pour la première fois, je veux obtenir son adresse e-mail de l'Facebook profil, mais ces données ne sont pas inclus dans le générés revendications. J'ai donc pensé à ces solutions de rechange pour obtenir l'adresse:
-
Charger le ASP.NET l'Identité moteur pour inclure l'adresse e-mail dans
l'ensemble des données qui sont récupérées à partir de Facebook et ensuite converti
pour les réclamations. Je ne sais pas si c'est possible. -
Utiliser le Facebook graph API
(https://developers.facebook.com/docs/getting-started/graphapi) à
récupérer l'adresse e-mail en utilisant le Facebook id d'utilisateur (qui est
inclus dans les données des sinistres). Mais cela ne fonctionne pas si l'utilisateur a
définir son adresse e-mail privée. -
Utiliser le Facebook graph API, mais en précisant "moi" au lieu de la
Facebook id utilisateur
(https://developers.facebook.com/docs/reference/api/user). Mais une
jeton d'accès est nécessaire, et je ne sais pas comment (ou si c'est
possible) récupérer le jeton d'accès ASP.NET utilise pour
obtenir les données de l'utilisateur.
La question est donc:
-
Comment puis-je charger le ASP.NET l'Identité moteur pour récupérer
des informations supplémentaires à partir de Facebook et de les inclure dans les revendications
les données? -
Ou sinon, comment puis-je récupérer l'généré jeton d'accès de sorte
que je peux demander à Facebook de moi?
Merci!
Remarque: pour que le système d'authentification de mon application utilise le code en se basant sur l'exemple de projet lié à cette SORTE de réponse: https://stackoverflow.com/a/18423474/4574
Vous devez vous connecter pour publier un commentaire.
Pour récupérer des informations supplémentaires à partir de facebook, vous pouvez spécifier les étendues que vous souhaitez inclure lorsque vous configurez le facebook des options d'authentification. Obtenir de l'information supplémentaire récupérée peut être atteint par la mise en œuvre du fournisseur OnAuthenticated méthode comme ceci:
Par le code ici je vois l'e-mail est déjà récupéré et a ajouté qu'une demande ici si facebook a envoyé. N'êtes-vous pas capable de le voir?
facebookOptions.Scope.Add("email")
, alors autant vous dire que l'e-mail de données est ajouté automatiquement une demande d'asile sans avoir à analyser les données json. Toutefois, j'ai maintenant un nouveau problème: lors de l'utilisation de votre code, en invoquantAuthenticationManager.GetExternalIdentity
dans le callback renvoie la valeur null à la place d'une instance deClaimsIdentity
. Avez-vous une idée de ce qui peut se passer? (et oui, je suis en ajoutant la bonne app id et le secret de la facebookOptions objet)SignInAsAuthenticationType = "External"
. Je vais accepter votre réponse, mais peut-être que vous voulez le modifier afin qu'il comprend ces trucs. 🙂Créer un nouveau Microsoft.Owin.De sécurité.Facebook.AuthenticationOptions objet de Démarrage.ConfigureAuth (StartupAuth.cs), en lui passant le FacebookAppId, FacebookAppSecret, et une nouvelle AuthenticationProvider. Vous allez utiliser une expression lambda pour passer le OnAuthenticated méthode un peu de code pour ajouter des Revendications de l'identité qui contient les valeurs que vous avez extrait à partir du contexte.L'identité. Cela comprendra access_token par défaut. Vous devez ajouter e-mail à la Portée. D'autres propriétés de l'utilisateur sont disponibles à partir du contexte.Utilisateur (voir le lien en bas par exemple).
De démarrage.Auth.cs
Dans AccountController, j'ai extrait le ClaimsIdentity de la AuthenticationManager à l'aide de l'externe cookie. Je puis ajouter à l'identité créée à l'aide de l'application de cookie. J'ai ignoré les revendications qui commence avec "...schemas.xmlsoap.org/ws/2005/05/identity/claims" depuis qu'il semblait rompre la connexion.
AccountController.cs
Et enfin, je veux afficher ce que les valeurs ne sont pas de l'AUTORITÉ LOCALE. J'ai créé une vue partielle _ExternalUserPropertiesListPartial qui apparaît sur la /Compte/Gérer la page. Je reçois les demandes que j'ai déjà stockées de AuthenticationManager.De l'utilisateur.Les réclamations et puis la passer à la vue.
AccountController.cs
Et juste pour être complet, le point de vue:
_ExternalUserPropertiesListPartial.cshtml
L'exemple et complète le code est sur GitHub: https://github.com/johndpalm/IdentityUserPropertiesSample
Et tous les commentaires, corrections ou des améliorations seraient appréciés.
Il a travaillé pour moi avec tout ce dans
Startup.Auth
:Et ensuite, dans la méthode
ExternalLoginCallback
ouExternalLoginConfirmation
vous avez reçu l'e-mail avec :Vous devez créer une instance de
FacebookAuthenticationOptions
et configuretheProvider
. LeProvider
contient un événement appeléOnAuthenticated
qui est déclenché lorsque vous vous connectez.Dans le code ci-dessus, je suis accédant à la
access_token
parcontext.AccessToken
et l'ajouter àClaims
de l'actuel loggedin utilisateur.Pour accéder à cette valeur plus tard vous avez besoin pour ce faire:
Pour simplifier tout cela, vous pouvez créer un
BaseController
et de faire tous vosControllers
héritent de celui-ci.La
BaseController
code serait:Ensuite pour obtenir le jeton d'accès sur votre code, vous avez juste besoin d'accéder à la propriété
FacebookAccessToken
.Il est possible de récupérer certains autres valeurs comme
Noter que tous les champs seront disponibles pour obtenir l'e-mail, vous devez exiger du
Scope
e-mail.Alors accès sur la
OnAuthenticated
événement commeVoici quelques mesures qui vous aideront. Je suis en train d'écrire un billet de blog, mais il faudra un certain temps...
- Ajouter des Étendues de Fb fournisseur et ajouter les données renvoyées par FB que les revendications
Utiliser le Jeton d'Accès et d'appeler Facebook C# SDK pour obtenir la liste d'amis de l'utilisateur
mon couple cents à toutes les réponses... si vous voulez continuer à demander à Facebook de vous-même, il est logique de prendre un coup d'oeil sur existant déjà Facebook paquet. Il offre quelques fonctionnalités intéressantes qui sont déjà mises en œuvre, de sorte que vous n'avez pas à re-mettre en œuvre vous-même... quelques exemples de la façon de l'utiliser à l'intérieur ASP.NET MVC de l'application, vous pouvez trouver ici.