У меня есть веб-приложение Facebook Connect (FBML), которое уже давно работает.
Все работает хорошо, однако пользователи сообщают о проблемах с помощью единого входа (и я видел проблемуна своем компьютере, но не смогли выполнить локальную репликацию).
В FBC существует «событие», в которое вы можете подключиться, чтобы автоматически определить, прошел ли пользователь аутентификацию в Facebook.
Это достигается с помощью этого:
FB.Connect.ifUserConnected(onUserConnected, null);
Затем функция onUserConnected может делать все, что ей нужно, для попытки единого входа.
Для меня то, что я делаю, этоAJAX-вызов на сервер, чтобы узнать, есть ли у пользователя активная учетная запись веб-сайта (на основе данных Facebook - идентификатор пользователя, который я сохраняю в моей системе при подключении).
Если они это сделают, я показываю модальное диалоговое окно jQuery («Соединение с Facebook») и выполняю window.location.reload ().
Затем сервер запускает и выполняет SingleПодпишись.Этот код выполняется на каждой странице:
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();
}
}
}
У меня никогда не возникало проблем с этим, но пользователь сообщает о «бесконечном» цикле, где отображается диалоговое окно, обновляется окно, отображается диалоговое окно,окно обновляется и т. д.
По сути, мой AJAX-вызов говорит, что пользователь существует, но мой единый вход - нет.
В это трудно поверить, потому что код очень похож:
Это веб-служба 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;
}
}
}
}
Так что, если ответ этого WS 'true', я делаю window.location.reload ();
Таким образом, я понятия не имею, в чем проблема (поскольку я не могу повторить), похоже, что единый вход не добавляет файл cookie проверки подлинности с помощью форм в поток ответов, или Response.Redirect (Request.RawUrl) нетправильная перезагрузка cookie.
Как другие справляются с этим?
Вот что должно произойти:
- Пользователь входит в Facebook (на самом Facebook)
- Пользователь заходит на мой сайт (который был предыдущимавторизован)
- Мой сайт сравнивает FBID с FBID в моей БД и регистрирует их.
Мой сайт является приложением ASP.NET 4.0 Web Forms, использующим "старый API JavaScript Facebook Connect (FeatureLoader.js) и проверка подлинности с помощью форм.
Единственное другое решение для вызова / окна AJAX, о котором я могу подумать, - это AJAX UpdatePanel.
Можеткто-нибудь мне помочь?
РЕДАКТИРОВАТЬ
Кроме того, я понимаю, что я также могу использовать 'reloadIfSessionStateChanged':true
для перезагрузки (которая останавливает бесконечный цикл), нопроблема в том, что я не могу показать свой красивый модный диалог.