如果您想知道“比赛条件”是什么,它是系统中的一个缺陷,而它高度依赖于时间。有关更多信息,请参阅此处的 wiki 。
因此,我的条件与 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,否则页面将一直刷新。=)