FacebookWebContext.Current.IsAuthorized在一个页面上工作,但不在另一个页面上工作

时间:2012-03-16 02:34:12

标签: facebook-c#-sdk

我在使用C#Facebook画布应用程序时遇到问题,无法确定用户是否已授权我的应用。

问题实际上只发生在辅助页面上。我的应用程序最初检查登录页面并正确确定用户已验证应用程序。

应用程序的简短概述:

  1. 用户喜欢app。
  2. 用户授权应用
  3. 用户向朋友发送信息(通过Facebook通知)
  4. 用户访问应用的朋友并获取信息。
  5. 所以步骤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>
    

    并想出为什么它可以在一个页面而不是另一个页面上正常工作?

    谢谢! 克雷格

1 个答案:

答案 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的完整文档。