ASP.NET MVC5 OWIN Facebook-Authentifizierung funktioniert plötzlich nicht



5 Answers

Habe dieses Problem gestern bemerkt. Facebook unterstützt Microsoft.Owin.Security.Facebook Version 3.0.1 nicht mehr. Für mich funktionierte es, Version 3.1.0 zu installieren. Um auf 3.1.0 zu aktualisieren, führen Sie den Befehl Install-Package Microsoft.Owin.Security.Facebook in der Package Manager-Konsole aus: https://www.nuget.org/packages/Microsoft.Owin.Security.Facebook

Question

Update 2017!

Das Problem, das ich hatte, als ich die ursprüngliche Frage gepostet habe, hat nichts mit den letzten Änderungen zu tun, die Facebook gemacht hat, als sie alle zur Version 2.3 ihrer API gezwungen haben. Eine Lösung für dieses spezielle Problem finden Sie in der Antwort von sammy34 . In Version 2.3 des Endpunkts / oauth / access_token wird jetzt JSON anstelle von formcodierten Werten zurückgegeben

Aus historischen Gründen, hier ist meine ursprüngliche Frage / Problem:

Ich habe eine MVC5-Webanwendung, die die integrierte Unterstützung für die Authentifizierung über Facebook und Google verwendet. Als wir diese App vor ein paar Monaten erstellten, folgten wir 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 alles hat gut funktioniert.

Jetzt hat die Facebook-Authentifizierung plötzlich aufgehört zu arbeiten. Die Google-Authentifizierung funktioniert immer noch gut.

Beschreibung des Problems: Wir klicken auf den Link, um eine Verbindung über Facebook herzustellen, wir werden zu Facebook weitergeleitet, wo wir gefragt werden, ob wir unserer Facebook-App Zugriff auf unser Profil gewähren möchten. Wenn wir auf "OK" klicken, werden wir zurück auf unsere Seite geleitet, aber anstatt eingeloggt zu sein, landen wir einfach auf dem Login-Bildschirm.

Ich habe diesen Prozess im Debug-Modus durchlaufen und ich habe dieses ActionResult in meinem Account-Controller gemäß dem oben genannten Tutorial:

// GET: /Account/ExternalLoginCallback
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
    if (loginInfo == null)
    {
        return RedirectToAction("Login");
    }
    ............

Beim Durchlaufen des Codes und bei der Rückkehr von Facebook ist das loginInfo-Objekt immer NULL, wodurch der Benutzer zurück zum Login geleitet wird.

Um zu verstehen, was tatsächlich hinter den Kulissen passiert, habe ich Fiddler installiert und den HTTP-Verkehr überwacht. Was ich entdeckt habe, ist, dass Facebook mit einem Klick auf "OK" im Facebook-Erlaubnisdialog zurück zu unserer Anwendung mit dieser URL umleitet:

https://localhost/signin-facebook?code=<access-token>

Diese URL ist keine tatsächliche Datei und wird wahrscheinlich von einem Controller / Handler verarbeitet, der in dieses OWIN-Framework eingebaut ist. Am wahrscheinlichsten ist es eine Verbindung zurück zu Facebook unter Verwendung des gegebenen Codes, um Informationen über den Benutzer abzufragen, der sich anzumelden versucht. Nun, das Problem ist, dass wir statt dessen:

/Account/ExternalLoginCallback?error=access_denied

Ich bin sicher, dass Facebook etwas tut, das heißt, anstatt uns die Benutzerdaten zu geben, leitet es uns mit dieser Fehlermeldung zurück.

Dies verursacht den AuthenticationManager.GetExternalLoginInfoAsync(); fehlschlagen und immer NULL zurückgeben.

Ich habe keine Ideen mehr. Soweit wir wissen, haben wir an unserem Ende nichts geändert.

Ich habe versucht, eine neue Facebook-App zu erstellen, ich habe versucht, das Tutorial wieder zu folgen, aber ich habe immer das gleiche Problem.

Irgendwelche Ideen willkommen!

Aktualisieren!

OK, das macht mich wahnsinnig! Ich habe jetzt die erforderlichen Schritte manuell ausgeführt, um die Authentifizierung durchzuführen, und alles funktioniert gut, wenn ich das tue. Warum in aller Welt funktioniert das nicht, wenn MVC5 Owin benutzt wird?

Das habe ich gemacht:

    // 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! Warum, zum Teufel, funktioniert das nicht, wenn man das MVC5 Owin-Zeug benutzt? Es ist offensichtlich etwas falsch mit der OWin-Implementierung.




Stellen Sie sicher, dass Sie eine externe Internetverbindung von Ihrer Anwendung erhalten. Wenn nicht, reparieren Sie Ihre externe Internetverbindung. Mein Problem war, dass ich eine EC2 AWS-Instanz verwendete, die plötzlich aufhörte, sich mit dem Internet zu verbinden. Es dauerte eine Weile, bis ich erkannte, dass das das Problem war.




Obwohl ich alles gemacht habe, was Sammy34 gesagt hat, hat es bei mir nicht funktioniert. Ich war am selben Punkt mit HaukurHaf : Wenn ich eine manuelle Suche im Browser mache, funktioniert es perfekt, aber wenn ich meine mvc app verwende, gibt GetExternalLoginInfoAsync() immer null zurück .

Also änderte ich einige Zeilen auf sammy34 Codes wie auf diesem Kommentar: https://.com/a/43148543/7776015

Ersetzt:

if (!request.RequestUri.AbsolutePath.Contains("/oauth"))
{
request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.Replace("?access_token", "&access_token"));
}
var result = await base.SendAsync(request, cancellationToken);
if (!request.RequestUri.AbsolutePath.Contains("/oauth"))
{
return result;
}

Anstatt von:

var result = await base.SendAsync(request, cancellationToken);
if (!request.RequestUri.AbsolutePath.Contains("access_token"))
return result;

Und diese Zeile in meine FacebookAuthenticationOptions eingefügt:

UserInformationEndpoint = "https://graph.facebook.com/v2.8/me?fields=id,name,email,first_name,last_name,picture"

und jetzt funktioniert es (Felder und Parameter optional)

Hinweis: Ich habe Microsoft.Owin.Security.Facebook nicht aktualisiert







Ich arbeite seit drei Tagen an einer Lösung. Und ich habe es gerade auf github gefunden ( https://github.com/aspnet/AspNetKatana/issues/38#issuecomment-290400987 )

var facebookOptions = new FacebookAuthenticationOptions()
{
    AppId = "xxxxx",
    AppSecret = "xxxxx",
};

// Set requested scope
facebookOptions.Scope.Add("email");
facebookOptions.Scope.Add("public_profile");

// Set requested fields
facebookOptions.Fields.Add("email");
facebookOptions.Fields.Add("first_name");
facebookOptions.Fields.Add("last_name");

facebookOptions.Provider = new FacebookAuthenticationProvider()
{
    OnAuthenticated = (context) =>
        {
            // Attach the access token if you need it later on for calls on behalf of the user
            context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));

            foreach (var claim in context.User)
            {
                //var claimType = string.Format("urn:facebook:{0}", claim.Key);
                var claimType = string.Format("{0}", claim.Key);
                string claimValue = claim.Value.ToString();

                    if (!context.Identity.HasClaim(claimType, claimValue))
                        context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Facebook"));
            }

            return Task.FromResult(0);
       }
};

app.UseFacebookAuthentication(facebookOptions);

Und um Werte zu bekommen

var info = await AuthenticationManager.GetExternalLoginInfoAsync();

if (info != null)
{
    var firstName = info.ExternalIdentity.Claims.First(c => c.Type == "first_name").Value;
    var lastName = info.ExternalIdentity.Claims.First(c => c.Type == "last_name").Value;
}



Ich hatte dieses Problem auch, aber es wurde nicht durch die Einstellung des Bereichs verursacht. Ich habe lange gebraucht, um das herauszufinden, aber was mich schließlich ansprach, war, einen benutzerdefinierten Logger einzurichten, indem ich Folgendes in OwinStartup.Configuration(IAppBuilder app) .

app.SetLoggerFactory(new LoggerFactory()); 
// Note: LoggerFactory is my own custom ILoggerFactory

Dies gab folgendes aus:

2014-05-31 21: 14: 48,508 [8] FEHLER
Microsoft.Owin.Security.Cookies.CookieAuthenticationMiddleware
[(null)] - 0x00000000 - Authentifizierung fehlgeschlagen
System.Net.Http.HttpRequestException: Beim Senden der Anforderung ist ein Fehler aufgetreten. ---> System.Net.WebException: Der entfernte Name konnte nicht
gelöst werden: "graph.facebook.com" unter
System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback (IAsyncResultar) --- Ende der inneren Ausnahme Stack-Trace --- at
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task
Aufgabe) um
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabenaufgabe) unter System.Runtime.CompilerServices.TaskAwaiter`1.GetResult () at
Microsoft.Owin.Security.Facebook.FacebookAuthenticationHandler.d__0.MoveNext ()

Basierend auf dem obigen Aufruf-Stack habe ich festgestellt, dass meine Azure-VM graph.facebook.com nicht auflösen konnte. Alles, was ich tun musste, um das zu beheben, war "ipconfig / registerdns" auszuführen und ich war alles behoben ...




Related