6

Ich habe eine localhost-Website, auf der ich mich über Facebook mit Facebook C# SDK angemeldet habe.getLoginStatus gibt den Status unbekannt zurück, wenn versucht wird, sich über Facebook mit JS SDK zu melden.

Startkonfiguration Klasse:

public class ExternalLoginConfig 
{ 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

     var facebookAuthenticationOptions = new FacebookAuthenticationOptions() 
     { 
      AppId = ConfigSettings.FacebookAppId, 
      AppSecret = ConfigSettings.FacebookAppSecret, 
      Scope = { "email" }, 
      Provider = new FacebookAuthenticationProvider() 
      { 
       OnAuthenticated = context => 
       { 
        var accessToken = context.AccessToken; 
        var facebookClient = new FacebookClient(accessToken); 

        var result = facebookClient.Get("me", new { fields = "email,first_name,last_name" }) as JsonObject; 

        string email = null; 
        string firstName = null; 
        string lastName = null; 

        if (result != null) 
        { 
         email = result.ContainsKey("email") ? (string) result["email"] : null; 
         firstName = result.ContainsKey("first_name") ? (string) result["first_name"] : null; 
         lastName = result.ContainsKey("last_name") ? (string) result["last_name"] : null; 
        } 

        if (firstName != null) 
        { 
         context.Identity.AddClaim(new Claim(ClaimTypes.GivenName, firstName)); 
        } 
        if (lastName != null) 
        { 
         context.Identity.AddClaim(new Claim(ClaimTypes.Surname, lastName)); 
        } 
        if (email != null) 
        { 
         context.Identity.AddClaim(new Claim(ClaimTypes.Email, email)); 
        } 

        return Task.FromResult(0); 
       }, 
       OnApplyRedirect = context => 
       { 
        context.Response.Redirect(context.RedirectUri + "&auth_type=reauthenticate"); 
       } 
      } 
     }; 
     app.UseFacebookAuthentication(facebookAuthenticationOptions); 
    } 
} 

Aktionen bilden Authentifikationssteuervorrichtung:

[HttpPost] 
[AllowAnonymous] 
public virtual ActionResult Login(string provider, string returnUrl) 
{ 
    ControllerContext.HttpContext.Session.RemoveAll(); 

    return new ExternalLoginResult(provider, 
     Url.Action("LoginCallback", "Oauth", new { ReturnUrl = returnUrl })); 
} 

[AllowAnonymous] 
public async Task<ActionResult> LoginCallback(string returnUrl, string error) 
{ 
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 

    if (loginInfo == null) 
    { 
     return Redirect(returnUrl); 
    } 

    User user = null; 
    string userName = Guid.NewGuid().ToString(); 
    string firstName = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.GivenName); 
    string lastName = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.Surname); 
    string email = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.Email); 
    string externalProviderName = loginInfo.Login.LoginProvider; 
    string externalProviderKey = loginInfo.Login.ProviderKey; 

    var externalAuthenticationInfo = new ExternalAuthenticationInfo() 
    { 
     Username = userName, 
     Email = email, 
     FirstName = firstName, 
     LastName = lastName, 
     ExternalProviderName = externalProviderName, 
     ExternalProviderKey = externalProviderKey 
    }; 

    var loginResult = userProvider.ExternalLogin(externalProviderKey, email, out user); 

    switch (loginResult) 
    { 
     case LoginResult.Success: 
     { 
      AuthenticationHelper.SetAuthenticatedUserId(user.ID); 
      break; 
     } 
     case LoginResult.NotRegistered: 
     { 
      var registerResult = userProvider.Register(userName, email, null, externalAuthenticationInfo); 

      if (registerResult.IsValid) 
      { 
       AuthenticationHelper.SetAuthenticatedUserId(registerResult.Result.ID); 
      } 

      break; 
     } 
    } 

    return Redirect(returnUrl); 
} 

Book JS SDK Initialisierung:

window.fbAsyncInit = function() { 
    FB.init({ 
     appId: '@ConfigSettings.FacebookAppId', 
     xfbml: true, 
     version: 'v2.4' 
    }); 
}; 

(function (d, s, id) { 
    var js, fjs = d.getElementsByTagName(s)[0]; 
    if (d.getElementById(id)) { return; } 
    js = d.createElement(s); js.id = id; 
    js.src = "//connect.facebook.net/en_US/sdk.js"; 
    fjs.parentNode.insertBefore(js, fjs); 
}(document, 'script', 'facebook-jssdk')); 

Ich bin versucht, einen Benutzer aus Facebook mit dem Facebook JS SDK anmelden, aber Aufruf:

FB.getLoginStatus(function facebookLogoutCallback(facebookResponse) { 
    if (facebookResponse.status !== 'connected') { 
     return; 
    } 

    FB.logout(facebookLogoutCallback); 
}); 

führt zu Status unknown statt connected, die in facebookResponse Objekt zurückgegeben wird. Ich habe auch versucht, FB.logout() ohne if Anweisung zu nennen, aber es hat nicht funktioniert.

Vielleicht können Sie sagen, dass dieses Verhalten von einem nicht autorisierten Benutzerstatus verursacht wird, aber nach der serverseitigen Anmeldung ist der Benutzer tatsächlich angemeldet: auf meiner Website und Facebook auch.

+0

was ist die wirkliche Lösung dafür? – manonthemoon

Antwort

8

Es scheint, dass derzeit ein Fehler in der FB.logout-Funktion ist. Nachdem es der Benutzer aufrufen kann nicht wieder in diese App angemeldet sein, um die JS SDK verwenden, da die FB.login Funktion
Objekt zurückgibt {status = „unbekannt“, authResponse = null}

EDIT:
gefunden, dass es eine Cookie namens "fblo_ *" erstellt nach FB.logout(), was der Grund dafür zu sein scheint. Ich kann nicht genau sagen, warum es da ist und was es tut, aber wenn ich es lösche, funktioniert die Anmeldung wieder.

Daher habe ich ein kleines Skript erstellt, das nach diesem Cookie sucht und es löscht, bevor ich FB.login() aufruft, das Sie wahrscheinlich in einem Klickereignis aufrufen möchten (https://developers.facebook.com/docs/reference/javascript/FB.login/v2.5).

function delete_cookie(name) 
{ 
    document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/'; 
} 


var cookies = document.cookie.split(";"); 
for (var i = 0; i < cookies.length; i++) 
{ 
    if(cookies[i].split("=")[0].indexOf("fblo_") != -1) 
     delete_cookie(cookies[i].split("=")[0]); 
} 
+0

Es gibt einen kleinen Fehler, bei dem einige 'fblo_' Cookies, die Sie teilen, führende Leerzeichen haben. Ich benutze jQuery '$ .trim', um diesen Whitespace zu entfernen. – sjagr

+0

Ich kam zu dieser Schlussfolgerung auch. Schön zu sehen, dass andere Leute das gleiche Problem haben. Keine Ahnung, warum es doch passiert ... – jperelli

Verwandte Themen