我在使用C#Facebook画布应用程序时遇到问题,无法确定用户是否已授权我的应用。
问题实际上只发生在辅助页面上。我的应用程序最初检查登录页面并正确确定用户已验证应用程序。
应用程序的简短概述:
所以步骤1-3工作。第4步是我遇到的一些问题。
我正在调用一个名为“HasAuthorizedApplication”的方法,以确保用户在尝试从API获取数据之前已授权该应用。
public bool HasAuthorizedApplication()
{
bool returnValue = false;
try
{
if (FacebookWebContext.Current != null)
{
returnValue = FacebookWebContext.Current.IsAuthorized(Scope.Split(','));
if (returnValue)
{
AccessToken = FacebookWebContext.Current.AccessToken;
HttpContext.Current.Session["accesstoken"] = AccessToken;
}
else
{
HttpContext.Current.Session["accesstoken"] = null;
}
}
}
catch
{
returnValue = false;
}
return returnValue;
}
“范围”只是我要求的权限:“publish_stream,email”
因此,在第4步中,“用户的朋友”点击Facebook通知并点击该应用的登录页面。它检查授权,如果朋友未授权,则显示auth对话框。
授权后,应用程序会重定向到辅助页面,在我从图表中获取通知的详细信息之前,我会再次检查以确保该朋友仍然授权该应用程序。
不幸的是,当我这次打电话时,“FacebookWebContext.Current.IsAuthorized”总是返回“false”。我注意到“AccessToken”和“SignedRequest”此时为空。我尝试重定向回授权对话框,但由于朋友已经验证过,它不会向用户显示。但每次返回我的辅助页面时,“IsAuthorized”调用都会返回false。 (如果我试图获取数据,另外返回false)
我打电话来获取围绕Facebook通知的数据:
public dynamic GetData(string dataId)
{
if (HasAuthorizedApplication())
{
var fb = new FacebookWebClient(AccessToken);
dynamic data = fb.Get(dataId);
return data;
}
return null;
}
其中“dataId”是通知的ID。
不可否认,我不太了解Javascript和后端之间的交互是如何工作的。我还在登陆页面和辅助页面上都有以下Javascript:
<script type="text/javascript">
FB.init({
appId: '<%=APPID %>',
status: true, // check login status
cookie: true, // enable cookies to allow the server to access the session
oauth: true,
xfbml: true // parse XFBML
});
</script>
并想出为什么它可以在一个页面而不是另一个页面上正常工作?
谢谢! 克雷格
答案 0 :(得分:0)
我知道这不是您正在寻找的答案,但FacebookWebContext是Facebook C#SDK V5的一部分,并且已被弃用。它有几个问题,最重要的是它取决于Facebook的auth cookie。 Facebook最近改变了他们的政策,表明开发人员不应再直接阅读Facebook Cookie,因为他们可能随时更改。因此,我们在Facebook C#SDK的V6中删除了这些功能。
话虽这么说,你应该使用客户端上的Facebook Javascript SDK而不是服务器上的C#SDK来处理上面你想要做的几乎所有事情。您可以使用服务器上的Facebook C#SDK执行最终验证。
因此,我建议您升级到Facebook C#SDK的V6,它不使用Facebook Cookie或包含FacebookWebContext对象。
您可以在http://csharpsdk.org找到Facebook C#SDK的完整文档。