6

Ho un sito web localhost, dove ho implementato l'accesso tramite Facebook utilizzando Facebook C# SDK.getLoginStatus restituisce lo stato sconosciuto quando si tenta di disconnettersi da Facebook utilizzando Facebook JS SDK

avvio classe di configurazione:

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); 
    } 
} 

azioni formano regolatore di autenticazione:

[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); 
} 

Facebook JS SDK di inizializzazione:

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')); 

Sto tentando di accedere un utente di facebook con il Facebook SDK JS, tuttavia chiamando:

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

    FB.logout(facebookLogoutCallback); 
}); 

porta allo stato di unknown invece di connected, che viene restituito in facebookResponse oggetto. Ho anche provato a chiamare FB.logout() senza la dichiarazione if, ma non ha funzionato.

Forse si può dire che questo comportamento è causato dallo stato di utente non autorizzato, ma dopo l'accesso lato server l'utente è effettivamente connesso: sul mio sito Web e anche su Facebook.

+0

qual è la vera soluzione? – manonthemoon

risposta

8

Sembra che ci sia un bug al momento nella funzione FB.logout. Dopo aver chiamato esso l'utente non può essere registrato in questa applicazione ancora una volta utilizzando l'SDK JS perché la funzione FB.login ritorna
Object {status = "sconosciuto", authResponse = null}

EDIT:
scoperto che c'è un cookie chiamato "fblo_ *" creato dopo FB.logout() che sembra essere la ragione per questo. Non posso dire esattamente perché è lì e cosa fa, ma cancellarlo fa funzionare di nuovo l'accesso.

Quindi ho creato un piccolo script che cerca questo cookie e lo elimina poco prima chiamo FB.login() che probabilmente si desidera chiamare in un evento click (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

C'è un piccolo bug in cui alcuni cookie 'fblo_' che hai diviso avranno degli spazi bianchi iniziali. Io uso jQuery '$ .trim' per rimuovere quello spazio vuoto. – sjagr

+0

Sono arrivato anche a questa collaborazione. È bello vedere che ci sono altre persone che hanno lo stesso problema. Non ho idea del motivo per cui sta accadendo però ... – jperelli