1

J'ai une application web Facebook Connect (FBML) qui a été en direct depuis un certain temps maintenantFacebook Connect -. Single Sign On Causes Infinite Loop :(

Tout fonctionne bien, mais les questions de SIGNALENT utilisateur avec le seul connexion (et j'ai vu le problème sur leur ordinateur, mais n'ont pas été en mesure de répliquer localement)

Avec FBC, il existe un «événement» que vous pouvez vous connecter pour déterminer automatiquement si l'utilisateur est authentifié à Facebook Ceci est réalisé via:

FB.Connect.ifUserConnected(onUserConnected, null); 

La fonction onUserConnected peut alors faire tout ce qui est nécessaire pour tenter une authentification unique. Pour moi, ce que je fais est un appel AJAX au serveur pour voir si l'utilisateur a un compte de site actif (basé sur les détails de Facebook - identifiant de l'utilisateur, que je stocke dans mon système quand ils se connectent). Si c'est le cas, je montre une boîte de dialogue jQuery modale ("Connecting with Facebook") et je fais un window.location.reload().

Le serveur entre alors dans, et fait le Single Sign On. Ce code est exécuté sur chaque page:

public static void SingleSignOn(string redirectUrl) 
     { 
      if (!HttpContext.Current.Request.IsAuthenticated) // If User is not logged in 
      { 
       // Does this user have an Account? 
       if (ActiveFacebookUser != null) 
       { 
        // Get the user. 
        var saUser = tblUserInfo.GetUserByUserId(ActiveFacebookUser.IdUserInfo); 

        if (saUser != null) 
        { 
         // Get the Membership user. 
         MembershipUser membershipUser = Membership.GetUser(saUser.UserID); 

         if (membershipUser != null && membershipUser.IsApproved) 
         { 
          // Log Them Automically. 
          FormsAuthentication.SetAuthCookie(membershipUser.UserName, true); 

          // At this point, the Forms Authentication Cookie is set in the HTTP Response Stream. 
          // But the current HTTP Context (IsAuthenticated) will read HTTP Request Cookies (which wont have the new cookie set). 
          // Therefore we need to terminate the execution of this current HTTP Request and refresh the page to reload the cookies. 
          HttpContext.Current.Response.Redirect(
           !string.IsNullOrEmpty(redirectUrl) ? redirectUrl : HttpContext.Current.Request.RawUrl, 
           true); 
         } 
         else 
         { 
          HandleUnregisteredFacebookUser(); 
         } 
        } 
        else 
        { 
         HandleUnregisteredFacebookUser(); 
        } 
       } 
       else 
       { 
        HandleUnregisteredFacebookUser(); 
       } 
      } 
     } 

Je ne l'ai jamais rencontré un problème avec son, mais l'utilisateur font état d'une boucle « infinie » où le dialogue s'affiche, la fenêtre est actualisée, de dialogue est affichée, la fenêtre est rafraîchie, etc.

Fondamentalement, mon appel AJAX dit que l'utilisateur existe, mais mon seul signe n'est pas.

Ce qui est difficile à croire parce que le code est très similaire:

Ceci est le service Web AJAX:

if (!HttpContext.Current.Request.IsAuthenticated) // If user is not yet authenticated 
      { 
       if (FacebookConnect.Authentication.IsConnected) // If user is authenticated to Facebook 
       { 
        long fbId; 

        Int64.TryParse(Authentication.UserId, out fbId); 

        if (fbId > 0) 
        { 
         tblFacebook activeUser = tblFacebook.Load(facebookUniqueId: fbId); 

         if (activeUser != null && activeUser.IsActive) // If user has an active account 
         { 
          return true; 
         } 
        } 
       } 
      } 

Donc, si la réponse de cette WS est « vrai », je fais une fenêtre .location.reload(); Donc, je n'ai aucune idée de ce que le problème est (comme je ne peux pas répliquer), semble que le Single Sign On n'ajoute pas correctement le cookie Forms Authentication au flux de réponse, ou le Response.Redirect (Request.RawUrl) ne recharge pas le cookie correctement.

Comment les autres s'en occupent-ils?

Voici ce qui devrait se produire:

  1. journaux utilisateur dans Facebook (sur Facebook lui-même)
  2. utilisateur vient sur mon site (qui a été préalablement autorisé)
  3. Mon site compare le FBID avec le FBID dans ma base de données, et les signe.

Mon site est une application ASP.NET 4.0 Web Forms, utilisant «l'ancienne» API JavaScript Facebook Connect (FeatureLoader.js) et l'authentification par formulaires.

La seule autre solution à un appel AJAX/window.reload que je peux penser est un AJAX UpdatePanel.

Quelqu'un peut-il m'aider?

EDIT

En outre, je me rends compte que je peux aussi utiliser 'reloadIfSessionStateChanged':true pour effectuer le rechargement (qui arrête la boucle infinie), mais le problème est que je ne peux pas montrer ma belle fantaisie de dialogue.

Répondre

1

J'ai donc trouvé quelques problèmes.

Tout d'abord, je ne devrais pas être un cookie persistant:

FormsAuthentication.SetAuthCookie(membershipUser.UserName, true); 

On ne devrait le faire lorsque l'utilisateur coche une case comme « Se souvenir de moi ». Deuxièmement, je vérifiais l'état FB Auth sur chaque page sur le serveur, donc cela pouvait être désynchronisé côté client.

Voici ma nouvelle solution - qui est meilleure, et a une sécurité intégrée pour la redoutée 'boucle infinie'.

Je ne vérifie plus le statut FB Auth sur le serveur, je fais sur le client:

FB.Connect.ifUserConnected(onUserConnected, null); // runs on every page request, on client-side 

Dans la fonction onUserConnection je fais ce qui suit:

  1. Appel service Web pour voir si L'utilisateur peut être connecté automatiquement (même WS que ci-dessus)
  2. Si c'est ok, vérifiez qu'un cookie spécial "Single Sign On" n'a pas été défini.
  3. Si elle n'a pas été définie, redirigez-la vers FacebookSingleSignOn.aspx.

FacebookSingleSignOn.aspx effectue les opérations suivantes:

  1. l'utilisateur signes dans l'utilisation de l'authentification par formulaire (comme ci-dessus)
  2. Crée un spécial "Single Sign On" cookie pour signifier une authentification unique a été tentée
  3. à la page d'accueil Redirige

Ainsi, au point 3 ci-dessus - c'est là la boucle infinie « pourrait » se produire. (comme le onUserConnected fonctionnera de nouveau)

Mais il est maintenant impossible (j'espère) pour que cela se produise, car il essayera seulement de faire le SSO s'ils ont déjà essayé.

J'efface le cookie SSO sur l'action de déconnexion de Facebook.

Maintenant fonctionne bien, la logique a du sens - et c'est fait sur le côté client (où il devrait être, car c'est là que FB fait de la magie).

Espérons que cela aidera quelqu'un d'autre.

Questions connexes