ASP.NET MVC5 OWIN Facebook authentification soudain ne fonctionne pas
Mise à jour en 2017!
Le problème que j'ai eu lorsque j'ai posté la question d'origine n'a rien à voir avec les récents changements de Facebook fait quand ils l'ont forcé tout le monde à la version 2.3 de leur API. Pour une solution à ce problème spécifique, voir sammy34 la réponse ci-dessous. La Version 2.3 de l' /oauth/access_token point de terminaison maintenant retourne du JSON au lieu de la forme codée valeurs
Pour des raisons historiques, voici ma question initiale/numéro:
J'ai une MVC5 application Web qui est à l'aide de la prise en charge intégrée pour l'authentification via Facebook et Google. Lorsque nous avons construit cette application il y a quelques mois, nous avons suivi ce tutoriel: http://www.asp.net/mvc/tutorials/mvc-5/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on et tout fonctionnait très bien.
Maintenant, tout d'un coup, le Facebook de l'authentification a juste cessé de travailler ensemble. Le Google authentification encore de grandes œuvres.
Description du problème: Nous cliquez sur le lien pour vous connecter à l'aide de Facebook, nous sommes redirigés vers Facebook où nous sommes invité à le faire si nous wan pas pour permettre à notre Facebook app accès à notre profil. Lorsque nous cliquons sur "OK" nous sommes redirigé vers notre site, mais au lieu d'être connecté en nous simplement se retrouver à l'écran de connexion.
Je suis passé par ce processus en mode debug et j'ai ce ActionResult dans mon compte au contrôleur par le tutoriel mentionné ci-dessus:
//GET: /Account/ExternalLoginCallback
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
return RedirectToAction("Login");
}
............
Lorsque vous exécutez le code et lors de son retour de Facebook, le loginInfo objet est toujours la valeur NULL, ce qui provoque l'utilisateur afin d'être redirigé vers la de login.
Afin de comprendre ce qui se passe réellement dans les coulisses, j'ai installé le Violoneux, et de surveiller le trafic HTTP. Ce que je disovered est qu'après avoir cliqué sur "OK" à la Facebook autorisation de dialogue, Facebook renvoie à notre application avec cette URL:
https://localhost/signin-facebook?code=<access-token>
Cette URL n'est pas un fichier réel et probablement manipulés par certains contrôleur/gestionnaire intégré dans ce OWIN cadre que je suis dans le doute. Le plus probable, c'est la connexion de retour à Facebook en utilisant le code de requête d'informations sur l'utilisateur qui est en train de se connecter. Maintenant, le problème est qu'au lieu de le faire, on est redirigé vers:
/Account/ExternalLoginCallback?error=access_denied
Dont je suis sûr, c'est quelque chose que Facebook est en train de faire, c'est, au lieu de nous donner les données de l'utilisateur, c'est de rediriger nous de retour avec ce message d'erreur.
Cela provoque la AuthenticationManager.GetExternalLoginInfoAsync();
à l'échec et à toujours retourner la valeur NULL.
Je suis complètement à court d'idées. Aussi loin que nous le savons, nous n'avons pas changer quoi que ce soit sur notre fin.
J'ai essayé de créer un nouveau Facebook application, j'ai essayé de suivre le tutoriel de nouveau, mais j'ai toujours le même problème.
Toutes les idées sont les bienvenues!
Mise à jour!
OK, ce qui me conduit fou! J'ai maintenant manuellement allé à travers les étapes nécessaires pour effectuer l'authentification et tout fonctionne très bien quand je fais ça. Pourquoi sur la terre, n'est-ce pas de travail lors de l'utilisation de la MVC5 Owin trucs?
C'est ce que j'ai fait:
//Step 1 - Pasted this into a browser, this returns a code
https://www.facebook.com/dialog/oauth?response_type=code&client_id=619359858118523&redirect_uri=https%3A%2F%2Flocalhost%2Fsignin-facebook&scope=&state=u9R1m4iRI6Td4yACEgO99ETQw9NAos06bZWilJxJrXRn1rh4KEQhfuEVAq52UPnUif-lEHgayyWrsrdlW6t3ghLD8iFGX5S2iUBHotyTqCCQ9lx2Nl091pHPIw1N0JV23sc4wYfOs2YU5smyw9MGhcEuinvTAEql2QhBowR62FfU6PY4lA6m8pD3odI5MwBYOMor3eMLu2qnpEk0GekbtTVWgQnKnH6t1UcC6KcNXYY
I was redirected back to localhost (which I had shut down at this point to avoid being redirected immediately away). The URL I was redirected to is this:
https://localhost/signin-facebook?code=<code-received-removed-for-obvious-reasons>
Now, I grabbed the code I got and used it in the URL below:
//Step 2 - opened this URL in a browser, and successfully retrieved an access token
https://graph.facebook.com/oauth/access_token?client_id=619359858118523&redirect_uri=https://localhost/signin-facebook&client_secret=<client-secret>&code=<code-from-step-1>
//Step 3 - Now I'm able to query the facebook graph using the access token from step 2!
https://graph.facebook.com/me?access_token=<access-token-from-step-2>
Pas d'erreurs, tout fonctionne très bien! Alors pourquoi diable est-ce pas de travail lors de l'utilisation de la MVC5 Owin des trucs? Il y a évidemment quelque chose de mal avec l'OWin mise en œuvre.
Bon je ne suis pas le seul 🙂 je vais être sûr de vous laisser savoir si je trouve une solution à ce problème!
J'ai eu le même problème, en mettant example.com/signin-facebook comme url de redirection sur facebook a résolu le problème
À la suite de votre URL de l'approche des tests, j'ai remarqué que mon application secret a changé! Des acclamations.
OriginalL'auteur HaukurHaf | 2014-03-12
Vous devez vous connecter pour publier un commentaire.
Mise à jour le 22 avril 2017: la Version 3.1.0 de Microsoft.Owin.* les paquets sont maintenant disponibles. Si vous rencontrez des problèmes après le Facebook de changements de l'API à partir du 27 Mars 2017, essayez la mise à jour de packages NuGet premier. Dans mon cas, ils ont résolu le problème (qui fonctionne correctement sur nos systèmes de production).
Réponse originale à cette question:
Dans mon cas, je me suis réveillé le 28 Mars 2017 pour découvrir que notre application Facebook authentification avait soudainement cessé de fonctionner. Nous n'avons rien changé dans le code de l'application.
Il s'avère que Facebook a fait une "force de mise à niveau" de leur API graphique à partir de la version 2.2 à 2.3 le 27 Mars 2017. L'une des différences entre ces versions de l'API semble que le Facebook d'extrémité
/oauth/access_token
répond plus à une forme du contenu codé corps, mais avec JSON au lieu.Maintenant, dans le Owin middleware, nous trouvons la méthode
protected override FacebookAuthenticationHandler.AuthenticateCoreAsync()
, qui parcourt le corps de la réponse en tant que forme et par la suite utilise leaccess_token
à partir de l'analyse de la forme. Inutile de dire que l'analyse du formulaire est vide, donc l'access_token
est également vide, ce qui provoque uneaccess_denied
d'erreur en aval de la chaîne.Corriger cela rapidement, nous avons créé une classe wrapper pour l'Facebook Oauth réponse
Puis, dans OwinStart, nous avons ajouté personnalisée de retour à canal gestionnaire...
...où le gestionnaire est défini comme:
Fondamentalement, le gestionnaire crée simplement un nouveau HttpResponseMessage contenant l'équivalent de la forme informations codées à partir de l'Facebook réponse JSON. Notez que ce code utilise la populaire Json.Net package.
Avec ce gestionnaire personnalisé, les problèmes semblent être résolus (bien que nous sommes encore à déployer pour prod :)).
Espoir qui sauve quelqu'un d'autre de se réveiller aujourd'hui avec des problèmes similaires!
Aussi, si quelqu'un a une solution plus propre à cela, j'aimerais savoir!
Même problème ici, merci pour votre post. Azure Mobile Services sont aussi affectés. social.msdn.microsoft.com/Forums/azure/en-US/...
Cela a été corrigé dans 3.1.0-RC1 github.com/aspnet/AspNetKatana/issues/38
Il se sent comme un nuage au dessus de ma tête si vous pensez que mon jamais essayez d'abord de créer un facebook login a été fait le 28 Mars...
Une version stable de 3.1.0 a été publié: nuget.org/packages/Microsoft.Owin.Security.Facebook
OriginalL'auteur sammy34
Remarqué ce problème hier. Facebook ne prend pas en charge Microsoft.Owin.De sécurité.Facebook version 3.0.1 plus. Pour moi, il a travaillé pour installer la version 3.1.0. Pour mettre à jour à 3.1.0, exécutez la commande
Install-Package Microsoft.Owin.Security.Facebook
dans le Gestionnaire de paquets de la Console: https://www.nuget.org/packages/Microsoft.Owin.Security.FacebookImpossible d'obtenir les informations de connexion à partir de ExternalLoginCallback méthode d'action. Essayer HttpContext.GetOwinContext().L'authentification.GetExternalLoginInfoAsync() renvoie la valeur null.
Une version stable de 3.1.0 a été publié: nuget.org/packages/Microsoft.Owin.Security.Facebook Ce fil est également utile pour le dépannage: github.com/aspnet/AspNetKatana/issues/38
Merci beaucoup à vous enregistrer mon temps au bout de 6 heures d'enquêtes!
Vous êtes une rockstar. Merci!
OriginalL'auteur JayPi
Ok j'ai une solution pour le problème.
C'est le code que j'avais déjà dans mon Démarrage.Auth.cs fichier:
Remarquez comment le
ligne a été commenté, mais je suis requête-ing pour l'e-mail plus tard dans la OnAuthenticated gestionnaire? Ouais, c'est vrai. Pour une raison quelconque, cela a fonctionné parfaitement pendant quelques semaines.
Ma solution était tout simplement de décommenter la x.La portée.Add("email"); ligne assurez-vous que le champ d'application=e-mail variable était présent dans la demande initiale de Facebook.
Maintenant tout fonctionne comme il l'a fait!
Je ne comprends pas pourquoi cela a fonctionné avant, comme elle le fut. La seule explication que je peux trouver, c'est que Facebook a changé quelque chose sur leur fin.
ce code d'erreur, le code ci-dessus manque attendent opérateur
Merci!!!! Curieusement j'avais besoin de faire votre changement d'obtenir FB connexion à partir d'un Azur a accueilli application (ainsi que les paramètres de certaines valeurs pour
Valid OAuth redirect URIs
dans mon Facebook paramètres de l'application) alors que de mon environnement de dev tout a bien fonctionné sans ces modifications.est-il possible que maintenant, c'est à défaut de nouveau? Peu importe ce que je fais, je ne peux pas obtenir
context.Email
parce que c'est toujours la valeur null (connexion fonctionne, mais le contexte a l'id et le nom de l'utilisateur)J'ai mis à jour Owin à 3.0.1-RC1 et définir
FacebookAuthenticationOptions { UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name"
dansStartup.Auth
; j'ai été autorisé et e-mail reçu 🙂 Pas de supplémentBackchannelHttpHandler
était nécessaire.OriginalL'auteur HaukurHaf
J'ai eu ce même problème avec la Google Authentification. Le suivant a fonctionné pour moi: Les changements de Google OAuth 2.0 et les mises à jour de Google middleware pour 3.0.0 version RC
OriginalL'auteur Maarten Docter
Le dernier Facebook de mise à niveau sur 2015-02-09 (https://www.nuget.org/packages/Microsoft.AspNet.WebPages.OAuth/)
La dernière version de l'API à ce point était à la version 2.2. La Version 2.2 expiré le 25 Mars 2017, qui est comme par hasard quand le problème a commencé. (https://developers.facebook.com/docs/apps/changelog)
Je devine Facebook probablement automatiquement mis à niveau de l'API et maintenant, le MS OAUTH bibliothèque est impossible d'analyser la nouvelle réponse.
tldr: Les Pages web de Microsoft OAuth bibliothèque est obsolète (pour FB au moins) et vous aurez probablement à trouver une autre solution
OriginalL'auteur RedTornado
Les solutions ci-dessus ne fonctionne pas pour moi. En fin de compte, il semble être lié à la Session. Par "réveil" de la session lors de l'appel précédent, de ne plus retourner la valeur null à partir de la GetExternalLoginInfoAsync()
Comme l'OP, j'ai eu la 3ème partie auth fonctionne très bien pour un long moment, puis soudain il s'arrêta. Je crois que c'était dû aux modifications apportées dans mon code lorsque j'ai créé la Session pour utiliser Cache Redis sur Azure.
OriginalL'auteur Joel Gallagher
J'ai eu ce problème aussi, mais ce n'était pas causée par la définition de la portée. M'a fallu du temps pour comprendre ça, mais ce que finalement clued m'en a été par la définition d'une coutume logger en définissant les éléments suivants dans
OwinStartup.Configuration(IAppBuilder app)
.Cette sortie suivantes:
Fondée sur le dessus de la pile des appels, j'ai trouvé que mon Azure VM n'a pas pu résoudre graph.facebook.com. Tout ce que j'avais à faire était de courir "ipconfig /registerdns" et je m'étais fixé...
Mon enregistreur de mise en œuvre est très personnalisé & ne pas travailler pour quelqu'un d'autre. Je viens de creuser un peu & il y a un DiagnosticsLoggerFactory (msdn.microsoft.com/en-us/library/...) qui probablement serait travailler pour vous.
Je vous remercie. Mon problème était présent et il est résolu maintenant: stackoverflow.com/questions/24894789/...
J'ai eu le même problème avec une cause légèrement différente: Les certificats X509 utilisé pour signer le Facebook certificat SSL n'est pas installé sur le serveur, donc quand je navigue sur facebook.com dans un navigateur, j'ai eu une erreur de certificat. La fixation de ce fixe le signin problème.
OriginalL'auteur jt000
Je travaille sur une solution pour trois jours. Et je viens de trouvé sur github(https://github.com/aspnet/AspNetKatana/issues/38#issuecomment-290400987)
Et d'obtenir des valeurs
OriginalL'auteur affair
Vérifier que vous obtenir une connexion internet à partir de votre application. Sinon, fixer à l'extérieur de votre connexion internet. Mon problème était que j'utilisais une AWS EC2 instance qui a soudainement cessé de se connecter à internet. Il m'a fallu un moment pour réaliser que c'était le problème.
OriginalL'auteur Ronen Festinger
Cela me rendait fou. Tout fonctionnait jusqu'à ce que j'ai déployé mon environnement de test. J'ai été à l'aide de Microsoft.Owin.De sécurité.Facebook version 3.0.1 de Nuget. Mis à jour pour la prelease la version 3.1.0 de Nuget et je n'ai plus eu l'erreur accès refusé...
OriginalL'auteur Ewert
Même si j'ai fait tout ce que sammy34 dit, il ne fonctionne pas pour moi. J'étais au même point avec HaukurHaf: Quand je fais apirequest manuellement sur navigateur, il fonctionne parfaitement, mais si j'utilise mon application mvc,
GetExternalLoginInfoAsync()
retourne toujours null.Donc j'ai changé quelques lignes sur sammy34's des codes comme sur ce commentaire: https://stackoverflow.com/a/43148543/7776015
Remplacé:
Au lieu de:
Et ajouté cette ligne dans mon
FacebookAuthenticationOptions
:et maintenant ça fonctionne.(les champs des paramètres en option)
Note: je n'ai pas de mise à jour
Microsoft.Owin.Security.Facebook
OriginalL'auteur gld-R