Если вам интересно, что такое «условие гонки», это недостаток системы, в то время как он сильно зависит от времени. См. Вики здесь для получения дополнительной информации.
Итак, у меня есть условие, касающееся Facebook Connect и реализации службы единого входа с веб-приложением ASP.NET 4.0 (Аутентификация на основе форм - IIS7).
Сам процесс (включая выход из системы) работает хорошо, но .....
Вот сценарий, где он не работает точно на 100%:
- Пользователь входит в Facebook.
- Пользователь переходит на мой сайт.
- Пользователь не вошел в систему автоматически (хотя должно быть).
- Пользователь обновляет страницу и автоматически входит в систему.
Когда я остановил код на шаге 3 - куки-файлы Facebook еще не появились (в HttpContext.Current.Request.Cookies
).
Но когда страница перезагружается (шаг 4) - там есть куки-файлы Facebook.
Для меня это может быть несколько вещей:
Я не уверен, что только в случае Facebook нет , пока не предоставил доступ к моему приложению для доступа к файлам cookie (задержка междоменного рукопожатия - xd_receiver.htm) или проблема с междоменные файлы cookie и жизненный цикл страницы ASP.NET.
Кто-нибудь еще имел дело с этой проблемой?
Это не "все и все в конце концов", но это раздражает (и не очень хорошо с точки зрения пользователя).
EDIT:
Хорошо, теперь я заметил что-то странное. Если я захожу в Facebook (через Facebook) и жду, скажем, 20 секунд, а затем захожу на мой сайт, он ВСЕ ЕЩЕ не регистрирует меня. Только после второй загрузки он входит в систему. Так что, возможно, это не проблема синхронизации - почему Нужно ли 2 обновления, чтобы прочитать куки?
Чтобы устранить некоторую путаницу - Facebook устанавливает файлы cookie (чтобы пользователь вошел в Facebook), а мой веб-сайт считывает эти файлы cookie.
Это происходит при каждом запросе страницы (логика в пользовательском элементе управления, который находится на каждой странице)
protected void Page_PreRender(object sender, EventArgs eventArgs)
{
if (FacebookUser.IsAuthenticated) // static property, checks HttpContext.Request.Cookies
{
// log them into my website
}
}
Итак, при первом обновлении - в HttpContext.Request.Cookies ничего нет.
При втором обновлении они есть.
Я думаю, что причина этого в том, что FB.Init выполняется на стороне клиента при каждом запросе страницы. Это то, что инициализирует куки. Поэтому, когда вы впервые заходите на мой сайт (после входа в Facebook), на стороне сервера (где я проверяю куки), эта функция еще не была запущена.
Так что я думаю, что здесь я проигрываю битву (пытаюсь получить доступ к куки-серверу, который установлен на стороне клиента).
РЕДАКТИРОВАТЬ 2:
Вот мой код инициализации (запускается на window.load):
FB.init('myapikey', 'xd_receiver.htm', null);
Я сейчас пытаюсь сделать что-то вроде этого:
FB.init('myapikey', 'xd_receiver.htm', null);
FB.getLoginStatus(function(response) {
if (!response.session) {
return false;
}
else {
window.location.reload();
}
});
Но я получаю ошибку JavaScript - "FB.getLoginStatus" не является функцией. = (
Это потому, что я использую следующую библиотеку JavaScript:
http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US
Принимая во внимание, что другие люди говорят использовать это:
http://connect.facebook.net/en_US/all.js
Я искал в документации новый API JS.
Для ссылки на других, кто наткнулся на этот поток, вот документация для «старого» JS API:
http://developers.facebook.com/docs/reference/oldjavascript/
Итак, я решил эту проблему с помощью FB.Connect.get_status () и перезагрузки окна, если пользователь прошел аутентификацию.
Спасибо всем за помощь.
Это моё «решение» проблемы, если кому-то ещё есть дело:
window.onload = function() {
FB.init('{0}', 'xd_receiver.htm');
FB.ensureInit(function() {
FB.Connect.ifUserConnected(onUserConnected, onUserNotConnected);
});
};
function onUserConnected() {
alert('connected!');
window.location.reload();
}
function onUserNotConnected() {
alert('not connected');
}
Конечно, вы должны проверить cookie проверки подлинности с помощью форм перед выполнением window.location.reload (), иначе страница будет просто обновляться. =) * +1087 *