无法使用Facebook C#SDK退出Facebook

时间:2011-06-18 06:04:57

标签: facebook facebook-c#-sdk logout

我想我已经阅读了关于在桌面应用程序内部退出Facebook主题的所有内容。到目前为止没有任何作品。

具体来说,我想将用户注销,以便他们可以切换身份,例如然后,在家共享计算机的人可以使用自己的Facebook帐户使用该软件,但没有机会切换帐户,这是非常混乱的。 (尚未测试切换Windows用户帐户,因为这对于最终用户来说太过分了,而且不应该是必要的。)

现在,我应该说我已将应用程序设置为使用这些权限:

string[] permissions = new string[] { "user_photos", "publish_stream", "offline_access" };

所以,那里包含“offline_access”。我不知道这是否会影响退出。

同样,我注销的目的仅仅是切换用户。 (如果有更好的方法,请告诉我。)

所谓的解决方案似乎是:

  • 使用JavaScript SDK(FB.logout())
  • 使用“m.facebook.com”代替
  • 创建您自己的网址(并可能使用m.facebook.com)
  • 创建您自己的URL并使用会话变量(在ASP.NET中)

第一种有点傻。为什么在使用C#时使用JavaScript?这是一个倒退,并在桌面应用程序中有很多额外的开销。 (我没有试过这个,因为在桌面应用程序中执行此操作简直令人讨厌。)如果有人可以确认这是唯一的工作方法,请执行此操作。我拼命想避免它。

第二个不起作用。也许它在过去有效,但是我无法尝试将其付诸实施都失败了。

第三个不起作用。我已经尝试了十几种变化而没有成功。

最后一个选项不适用于桌面应用程序,因为它不是ASP.NET,并且您没有要使用的会话变量。

Facebook C#SDK注销也不再有效。即。

public FacebookLoginDialog(string appId, string[] extendedPermissions, bool logout)
{
    IDictionary<string, object> loginParameters = new Dictionary<string, object>
                              {
                              { "response_type", "token" },
                              { "display", "popup" }
                              };

    _navigateUri = FacebookOAuthClient.GetLoginUrl(appId, null, extendedPermissions, logout, loginParameters);

    InitializeComponent();
}

我记得它过去有效,但现在已经不再适用了。 (这真让我困惑......)

现在它将用户引导到Facebook移动页面,用户必须手动注销。

现在,我可以通过浏览器自动化来自动点击用户的注销链接,但是,如果Facebook更新移动UI,这很容易破坏。它也很麻烦,可能比尝试使用JavaScript SDK FB.logout()方法更糟糕(虽然不是很多)。

我搜索了某种文档,但是,我在Facebook开发人员文档中找不到任何说明如何注销应用程序的内容。

有没有人解决过这个问题,或者看过任何可以移植到Facebook C#SDK的文档?

如果有人可以指出一些可以使用它的文档,我当然愿意使用WebClient或HttpClient / Response。我根本无法找到任何显示此方法如何工作的低级文档。

提前感谢您提供任何建议,指示或链接。

5 个答案:

答案 0 :(得分:3)

这个问题已经回答here,建议使用下面的网址注销,因为facebook显然正在跳过“下一个”参数

https://www.facebook.com/logout.php?next=[redirect_uri]&access_token=[access_token]

答案 1 :(得分:1)

我猜您要将用户注销,以便您可以登录其他帐户。在这种情况下,我会建议使用WebAuthenticationBroker进行此方法:

经过一段时间的实验并且上面的任何一个例子没有运气,我已经知道提交注销请求并使用重定向网址到您的登录网址是完美的。

以下是我用来将请求链接在一起的代码:

var logIn = this.Client.GetLoginUrl(
              new
              {
                client_id = AppId,
                redirect_uri = App.FacebookAuthUri.AbsoluteUri,
                scope = AuthTokens.FACEBOOK_PERMISSIONS,
                display = "popup",
                response_type = "token"
              });


    var logOut = this.Client.GetLogoutUrl(new
    {
      next = logIn,
      access_token = Settings.FacebookToken.Value
    });

    if (Settings.FacebookToken.Value != null) WebAuthenticationBroker.AuthenticateAndContinue(logOut);

现在,每当您将用户定向到WebAuthenticationBroker时,用户都将被重定向到登录页面。

答案 2 :(得分:0)

请参阅此blog post

使用FacebookOAuthClient()&amp;获取注销网址发送http请求到网址..

答案 3 :(得分:0)

好吧,我发现什么都没有用,所以我采取了讨厌的黑客行为。

FacebookOAuthClient.GetLogoutUrl()方法URL不会将我注销,但它会返回“m.facebook.com”URL,例如:

http://m.facebook.com/logout.php?next=http://www.facebook.com/dialog/oauth/?response_type=token&display=popup&scope=user_about_me%252coffline_access&client_id=123456789012345&redirect_uri=http%253a%252f%252fwww.facebook.com%252fconnect%252flogin_success.html&confirm=1

移动页面在页面底部有一个“注销”链接。

尝试捕获锚标记:

HtmlElementCollection hec = wbrFacebookAuth.Document.GetElementsByTagName("a");
foreach (HtmlElement elem in hec)
{
    // the logout link has a data-sigil="logout" attribute:
    string datasigil = elem.GetAttribute("data-sigil").ToLower();
    if (datasigil == "logout")
    {
    wbrFacebookAuth.Navigate(elem.GetAttribute("href"));
    break;
    }
}

在Navigated WebBrowser中,事件是不可预测且不可靠的。捕获它的实际方法无关紧要。例如这也不起作用:

        string logoutPattern = @"<a href=""(/logout.[^""]+)""";

        Regex rx = new Regex(logoutPattern);
        if (rx.IsMatch(wbMain.DocumentText))
        {
            MatchCollection mc = rx.Matches(wbMain.DocumentText);
            if (mc.Count > 0)
            {
                foreach (Match m in mc)
                {
                    Console.WriteLine("*** " + m.ToString());
                }
            }
        }

但是,它可以在DocumentCompleted事件处理程序中可靠地捕获。

private void wbrFacebookAuth_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
   if (_logout)
   {
    HtmlElementCollection hec = wbrFacebookAuth.Document.GetElementsByTagName("a");
    foreach (HtmlElement elem in hec)
    {
        // the logout link has a data-sigil="logout" attribute:
        string datasigil = elem.GetAttribute("data-sigil").ToLower();
        if (datasigil == "logout")
        {
        wbrFacebookAuth.Navigate(elem.GetAttribute("href"));
        break;
        }
    }
   }
}

问题在于它现在正在加载2页而不是1页,而且它仍然有点乱。但是,它的工作原理。

答案 4 :(得分:0)

与丢失注销按钮有同样的问题,并在前几天通过谷歌发现此提示:

打开https://developers.facebook.com/?ref=pf(称为“facebook开发者网站”),您可以在那里找到常用的登录/退出按钮。

不要问我它是如何工作的以及为什么它有效,我只是按照我发现自己的指示而且它对我有用

祝你好运,祝福