【发布时间】:2025-12-29 01:05:11
【问题描述】:
如果您想知道“比赛条件”是什么,它是系统中的一个缺陷,而它高度依赖于时间。有关更多信息,请参阅 wiki here。
因此,我的条件与 Facebook Connect 相关,并使用 ASP.NET 4.0 Web 应用程序(基于表单的身份验证 - IIS7)实现单点登录服务。
进程本身(包括注销)运行良好,但是.....
以下是它并非完全 100% 工作的场景:
- 用户登录 Facebook。
- 用户导航到我的网站。
- 用户未自动登录(应该是)。
- 用户刷新页面,自动登录。
当我在第 3 步中对代码进行断点时 - Facebook Cookie 还不存在(在 HttpContext.Current.Request.Cookies 中)。
但是当页面重新加载时(第 4 步)- Facebook Cookie 就在那里。
对我来说,这可能是很多事情:
我不确定这是否只是 Facebook 尚未尚未授予我的应用程序访问 cookie 的权限(跨域握手延迟 - xd_receiver.htm),还是一个问题具有跨域 cookie 本身和 ASP.NET 页面生命周期。
其他人处理过这个问题吗?
这不是“一劳永逸”,但它很烦人(从用户的角度来看也不是很好)。
编辑:
好吧,我现在注意到了一些奇怪的事情。如果我登录 Facebook(通过 Facebook),然后等待 20 秒,然后转到我的网站,它仍然没有让我登录。只有在第二次加载后它才会让我登录。所以也许这不是时间问题 - 为什么是否需要刷新 2 次才能读取 cookie?
为了消除一些混乱 - 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 在每个页面请求的客户端执行。这就是初始化 cookie 的原因。因此,当您第一次访问我的网站(登录 Facebook 后)时,在服务器端(我在其中检查 cookie),此功能尚未运行。
所以我认为我在这里打了一场失败的战斗(尝试访问 cookie 服务器端,即设置客户端)。
编辑 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
我正在查看新 JS API 的文档。
为了参考其他偶然发现这个线程的人,这里是“旧”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');
}
当然,您应该在执行 window.location.reload() 之前检查 Forms Authentication cookie,否则页面将一直刷新。 =)
【问题讨论】:
-
比赛条件...有一个标签 ;)
标签: asp.net cookies facebook cross-domain race-condition