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:
- journaux utilisateur dans Facebook (sur Facebook lui-même)
- utilisateur vient sur mon site (qui a été préalablement autorisé)
- 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.