ASP.NET MVC5 OWIN Facebook-Authentifizierung, plötzlich nicht arbeiten
Update 2017!
Das Problem, das ich hatte, als ich die ursprüngliche Frage veröffentlicht hat, hat nichts zu tun mit den letzten änderungen, die Facebook vorgenommen, wenn Sie jeder gezwungen auf die version 2.3 Ihrer API. Für eine Lösung dieses spezifischen Problems, siehe sammy34 Antwort unten. Version 2.3 der /oauth/access_token Endpunkt gibt jetzt JSON statt form-codierten Werte
Aus historischen Gründen, hier ist meine ursprüngliche Frage/Problem:
Habe ich eine MVC5 Web-Anwendung, die mithilfe der integrierten Unterstützung für die Authentifizierung über Facebook und Google. Wenn wir Bauten diese app vor ein paar Monaten, wir folgten diesem tutorial: http://www.asp.net/mvc/tutorials/mvc-5/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on und es hat alles Super geklappt.
Nun, ganz plötzlich, die Facebook-Authentifizierung hat einfach aufgehört zu arbeiten insgesamt. Die Google Authentifizierung funktioniert immer noch großartig.
Beschreibung des Problems: Wir klicken Sie auf den link Verbindung mit Facebook, wir werden umgeleitet und Facebook, wo wir aufgefordert werden, wenn wir wan nicht zulassen, dass unsere Facebook-app Zugriff auf unser Profil. Wenn wir auf "OK", wir werden umgeleitet auf unsere Seite zurück, aber anstatt dass Sie angemeldet sind wir einfach am Ende auf den login-Bildschirm.
Ich gegangen durch diesen Prozess im debug-Modus und ich habe diese ActionResult, die in meinem Konto controller als pro das tutorial, das oben erwähnt ist:
//GET: /Account/ExternalLoginCallback
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
return RedirectToAction("Login");
}
............
Wenn man durch den code, und nach der Rückkehr von Facebook, die loginInfo-Objekt immer NULL, was bewirkt, dass der Benutzer umgeleitet werden, um zurück zur login -.
Um zu verstehen, was tatsächlich hinter den kulissen geschieht, ich habe Fiddler installiert und überwacht den HTTP-Verkehr. Was ich disovered ist, dass nach einem Klick auf "OK" auf der Facebook-permission-dialog, Facebook Umleitungen zurück zu unserer Anwendung mit der URL:
https://localhost/signin-facebook?code=<access-token>
Diese URL ist nicht eine tatsächliche Datei und wahrscheinlich behandelt, indem einige controller/handler, die in diesem OWIN Rahmen, den ich vermute. Die meisten wahrscheinlich, es ist eine Verbindung zurück zu Facebook mit dem angegebenen code zur Abfrage von Informationen über den Benutzer, die versuchen, sich einzuloggen. Nun, das problem ist, dass anstatt das zu tun, wir werden umgeleitet:
/Account/ExternalLoginCallback?error=access_denied
Denen ich sicher bin, dass ist etwas, was Facebook tut, ist, dass, anstatt uns die Daten des Nutzers, es wird umleiten wir uns wieder mit dieser Fehlermeldung.
Dies bewirkt, dass die AuthenticationManager.GetExternalLoginInfoAsync();
zu scheitern und immer wieder NULL.
Ich bin völlig ratlos. Soweit wir wissen, Taten wir nichts ändern an unserem Ende.
Ich habe versucht, erstellen Sie eine neue Facebook app, die ich ausprobiert habe, nach dem tutorial wieder, aber ich habe immer das gleiche problem.
Irgendwelche Ideen willkommen!
Update!
OK, das treibt mich in den Wahnsinn! Ich habe jetzt manuell gegangen durch die erforderlichen Schritte zum durchführen der Authentifizierung und funktioniert alles Super wenn ich das tun. Warum auf der Erde ist diese nicht funktioniert, wenn mit dem MVC5 Owin Zeug?
Dies ist, was ich getan habe:
//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>
Keine Fehler, alles funktioniert Super! Dann warum zum Teufel wird dieser nicht funktioniert, wenn mit dem MVC5 Owin Zeug? Es ist offensichtlich etwas falsch mit der OWin-Implementierung.
Gut, ich bin nicht der einzige 🙂 ich werde sicher sein, Sie wissen zu lassen, wenn ich eine Lösung für dieses problem!
Ich hatte das gleiche problem, putting example.com/signin-facebook als redirect-url auf facebook löste das Problem
Nach Ihrer URL-testing-Ansatz, bemerkte ich, dass meine app secret hatte sich verändert! Cheers.
InformationsquelleAutor HaukurHaf | 2014-03-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
- Update 22. April 2017: Version 3.1.0 von Microsoft.Owin.* Pakete sind jetzt verfügbar. Wenn Sie Probleme nach Facebook ' s API-änderungen vom 27. März 2017, versuchen Sie die aktualisierte NuGet-Pakete zuerst. In meinem Fall das problem gelöst (funktioniert Prima auf unsere Produktionssysteme).
Original Antwort:
In meinem Fall wachte ich am 28 März 2017, zu entdecken, dass unsere app die Facebook-Authentifizierung hatte plötzlich aufgehört zu arbeiten. Wir hatten nichts verändert in den app-code.
Es stellt sich heraus, dass Facebook hat eine "force upgrade" Ihrer Grafik-API von der version 2.2 auf 2.3 am 27. März 2017. Einer der Unterschiede in diesen Versionen der API scheint zu sein, dass die Facebook-Endpunkt
/oauth/access_token
reagiert nicht mehr mit einer form-codierten Inhalt Körper, sondern mit JSON statt.Nun, in der Owin-middleware, finden wir die Methode
protected override FacebookAuthenticationHandler.AuthenticateCoreAsync()
, die analysiert den Hauptteil der Antwort als form und anschließend verwendet dieaccess_token
aus den analysierten form. Unnötig zu sagen, der Analysierte form ist leer, so dass dieaccess_token
ist auch leer, was zu eineraccess_denied
Fehler weiter unten in der Kette.Dieses Problem zu beheben schnell, erstellten wir eine wrapper-Klasse für die Facebook-Oauth-Antwort
Dann, in OwinStart, wir noch eine zusätzliche back-Kanal-handler...
...wo der handler definiert ist als:
Grundsätzlich die handler erstellt einfach eine neue HttpResponseMessage mit der äquivalenten form-codierten Informationen aus dem Facebook JSON-Antwort. Beachten Sie, dass dieser code verwendet die beliebte Json.Net Paket.
Mit diesem benutzerdefinierten handler, die Probleme scheinen gelöst zu sein (obwohl wir sind noch zu implementieren prod :)).
Hoffe, das spart jemand anderes aufwachen heute mit ähnlichen Problemen!
Auch, wenn jemand eine sauberere Lösung, ich würde gerne wissen,!
Gleiche problem hier, vielen Dank für deinen Beitrag. Azure Mobile Services sind auch betroffen. social.msdn.microsoft.com/Forums/azure/en-US/...
Dies wurde behoben in 3.1.0-RC1 github.com/aspnet/AspNetKatana/issues/38
Es fühlt sich wie eine Wolke über meinem Kopf, wenn Sie denken, dass meine immer zuerst versuchen, erstellen Sie eine facebook-Anmeldung war eigentlich am 28. März...
Eine stabile version 3.1.0 veröffentlicht wurde: nuget.org/packages/Microsoft.Owin.Security.Facebook
InformationsquelleAutor sammy34
Bemerkt, dass dieses problem gestern auch. Facebook bietet keine Unterstützung für Microsoft.Owin.Sicherheit.Facebook version 3.0.1 nicht mehr. Bei mir funktionierte es zu installieren, version 3.1.0. Update auf 3.1.0, führen Sie den Befehl
Install-Package Microsoft.Owin.Security.Facebook
im Paket-Manager-Konsole: https://www.nuget.org/packages/Microsoft.Owin.Security.FacebookKeine login-Daten aus ExternalLoginCallback action-Methode. Versuchen HttpContext.GetOwinContext().Die Authentifizierung.GetExternalLoginInfoAsync() null zurück.
Eine stabile version 3.1.0 veröffentlicht wurde: nuget.org/packages/Microsoft.Owin.Security.Facebook Dieser thread ist auch hilfreich für die Fehlersuche: github.com/aspnet/AspNetKatana/issues/38
Dank sehr viel Sie sparen meine Zeit nach 6 Stunden Untersuchungen!
Du bist ein rockstar. Danke!
InformationsquelleAutor JayPi
Ok ich habe eine Lösung für das problem.
Dies ist der code, den ich zuvor in meinem Systemstart.Auth.cs-Datei:
Beachten Sie, wie die
Zeile auskommentiert, aber trotzdem bin ich Abfrage-ing für die e-mail später in der OnAuthenticated handler? Yup, das ist richtig. Aus irgendeinem Grund funktionierte einwandfrei für ein paar Wochen.
War meine Lösung zu einfach kommentieren Sie die x.Umfang.Add("email"); Zeile stellen Sie sicher, dass die scope=E-Mail-Variablen war in der ersten Anfrage an Facebook.
Nun funktioniert alles wie es war!
Kann ich nicht verstehen, warum dies war, bevor, wie es war. Die einzige Erklärung, die ich mit oben kommen kann ist, dass Facebook etwas verändert an Ihrem Ende.
dieser code hat Fehler, der code oben fehlt await-operator
Danke!!! Merkwürdig, ich brauchte, um Ihre änderungen zu bekommen, die FB-login-arbeiten aus einer Azure-gehostete app (zusammen mit Einstellungen einige Werte für
Valid OAuth redirect URIs
in meiner Facebook-app-Einstellungen) in der Erwägung, dass aus meiner dev-Umgebung alles geklappt hat, ohne diese änderungen.ist es möglich, dass nun dieses Versagen wieder? Egal was ich mache, ich kann nicht
context.Email
weil es immer null (login funktioniert, aber der Kontext hat nur die id und user-name)Ich habe ein Upgrade Owin auf 3.0.1-RC1 und setzen
FacebookAuthenticationOptions { UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name"
imStartup.Auth
; ich wurde autorisiert und empfangene E-Mails 🙂 Keine extraBackchannelHttpHandler
nötig war.InformationsquelleAutor HaukurHaf
Ich hatte das gleiche Problem mit der Google-Authentifizierung. Die folgenden arbeitete für mich: Änderungen an Google OAuth 2.0 und updates im Google-middleware für 3.0.0 RC Version
InformationsquelleAutor Maarten Docter
Den letzten Facebook-upgrade wurde auf 2015-02-09 (https://www.nuget.org/packages/Microsoft.AspNet.WebPages.OAuth/)
Die neueste version der API an diesem Punkt war die version 2.2. Version 2.2 abgelaufen am 25 März 2017, das ist zufällig, Wann das problem begann. (https://developers.facebook.com/docs/apps/changelog)
Ich vermute, dass Facebook wohl automatisch aktualisiert die API und jetzt die MS OAUTH-Bibliothek ist nicht in der Lage zu analysieren, die neue Antwort.
tldr: Die Microsoft-Webseiten OAuth-Bibliothek ist veraltet (für FB zumindest) und Sie werden wahrscheinlich haben, um eine andere Lösung finden
InformationsquelleAutor RedTornado
Die oben genannte Lösung hat bei mir nicht funktioniert. Am Ende, so schien es, im Zusammenhang mit der Sitzung. Durch das "aufwachen" ist die session im vorherigen Anruf, es würde nicht mehr null zurück, aus der GetExternalLoginInfoAsync()
Wie der OP, hatte ich die 3rd-party-auth arbeiten gut für eine lange Zeit, dann plötzlich hörte es auf. Ich glaube, es war aufgrund der änderungen in meinem code, wenn ich die Sitzung für die Verwendung von Redis-Cache auf Azure.
InformationsquelleAutor Joel Gallagher
Ich hatte dieses problem auch, aber es war nicht verursacht durch die Einstellung der Bereich. Ich brauchte eine lange Zeit, das herauszufinden, aber das, was schließlich hat mich eines besseren belehrt wurde, indem ein benutzerdefinierter-logger, indem Sie den folgenden in
OwinStartup.Configuration(IAppBuilder app)
.Diese ausgegeben die folgenden:
Basierend auf den oben genannten Aufruf-stack fand ich, dass meine Azure VM nicht in der Lage war zu beheben graph.facebook.com. Alle die ich tun musste, um das zu korrigieren war, um ausführen "ipconfig /registerdns" und ich war ganz fest...
Meine logger-Implementierung ist sehr individuell & würde nicht arbeiten für jemand anderes. Ich habe gerade ein wenig Graben & es gibt eine DiagnosticsLoggerFactory (msdn.microsoft.com/en-us/library/...), die wahrscheinlich für Sie arbeiten würde.
Danke. Mein problem war, und es ist gelöst jetzt:
Ich hatte das gleiche problem mit einer etwas anderen Ursache: X509-Zertifikate, die zum signieren der Facebook SSL-Zertifikat wurde nicht auf dem server installiert, so dass, wenn ich navigiert facebook.com in einem browser bekam ich ein Zertifikat Fehler. Die Festsetzung dieser fixiert die signin problem.
InformationsquelleAutor jt000
Habe ich gearbeitet, auf die Lösung für drei Tage. Und ich habe es gerade gefunden auf github(https://github.com/aspnet/AspNetKatana/issues/38#issuecomment-290400987)
Und um Werte
InformationsquelleAutor affair
Überprüfen Sie, ob Sie eine externe internet-Verbindung von Ihrer Anwendung. Wenn nicht, beheben Sie Ihre internet-Verbindung. Mein problem war, dass ich über eine AWS EC2-Instanz, die plötzlich nicht mehr die Verbindung zum internet. Es dauerte eine Weile, um zu realisieren, dass war das problem.
InformationsquelleAutor Ronen Festinger
Dieser fuhr mich verrückt. Alles war arbeiten, bis ich eingesetzt, meine staging-Umgebung. Ich war mit Microsoft.Owin.Sicherheit.Facebook version 3.0.1 von Nuget. Aktualisiert, um die prelease-version 3.1.0 von Nuget und die ich nicht mehr habe die Fehlermeldung "Zugriff verweigert"...
InformationsquelleAutor Ewert
Obwohl ich alles Tat, was sammy34 sagte, es hat nicht funktioniert für mich. Ich war an der gleichen Stelle mit HaukurHaf: Wenn ich apirequest manuell im browser funktioniert es perfekt, aber wenn ich meine mvc-app
GetExternalLoginInfoAsync()
gibt immer null.Also änderte ich einige Zeilen auf sammy34's codes wie auf diesen Kommentar: https://stackoverflow.com/a/43148543/7776015
Ersetzt:
Statt:
Hinzugefügt und diese Zeile in meine
FacebookAuthenticationOptions
:und jetzt funktioniert es.(Felder und Parameter, optional)
Hinweis: ich habe kein update
Microsoft.Owin.Security.Facebook
InformationsquelleAutor gld-R