Rule #6 of the Facebook developer policy说我必须提供一个明确的注销链接,但无法使其正常工作。

我的目标是让我的应用程序退出Facebook,或者是整个Facebook体验环境中的用户,或者两者都注销。到目前为止,我什么都做不了。

我使用Azure ACS而不使用典型的FB API,这可能会使情况变得复杂。我尝试过的事情包括:

Attempt 1: Facebook OAuth Logout

 "http://www.facebook.com/logout.php?api_key={0}&;session_key={1}";
 // I don't know how to get the session key.  I attempted the values stored in
 // the claim  "http://www.facebook.com/claims/AccessToken" but no luck


尝试2:ACS注销(未记录?)

https://tlsadmin.accesscontrol.windows.net/v2/wsfederation?wa=wsignoutcleanup1.0


这两种方法均不允许备用Facebook用户登录。任何链接将不胜感激。

简化问题


如何获取* .accescontrol.windows.net重定向回我的网站?

最佳答案

ACS的2012年12月更新包括对联合单点注销的支持:


使用WS-Federation协议。使用ACS的Web应用程序
使用启用与身份提供商的单点登录(SSO)
WS-Federation协议现在可以利用单点注销的优势
能力。当用户退出Web应用程序时,ACS可以
自动将用户从身份提供者注销并从用户注销
使用相同身份提供者的其他依赖方应用程序。

WS-Federation身份提供程序启用了此功能,包括
Active Directory联合身份验证服务2.0和Windows Live ID
(微软帐户)。要启用单点注销,ACS会执行
WS-Federation协议端点的以下任务:


ACS识别来自身份提供者的wsignoutcleanup1.0消息
并通过向依赖方发送wsignoutcleanup1.0消息进行响应
应用程序。
ACS识别wsignout1.0和来自依赖方的wreply消息
应用程序并通过发送wsignout1.0消息来响应身份
提供者和wsignoutcleanup1.0消息给依赖方
应用程序。



Code Sample: ASP.NET MVC 4 with Federated Sign-out中,执行以下操作以退出ACS:

(请注意,Windows Identity Foundation现在已合并到.NET 4.5 Framework中,这就是下面的新名称空间的原因)

using System.IdentityModel.Services;
using System.IdentityModel.Services.Configuration;

public ActionResult Logout()
{
    // Load Identity Configuration
    FederationConfiguration config = FederatedAuthentication.FederationConfiguration;

    // Get wtrealm from WsFederationConfiguation Section
    string wtrealm = config.WsFederationConfiguration.Realm;
    string wreply;

    // Construct wreply value from wtrealm (This will be the return URL to your app)
    if (wtrealm.Last().Equals('/'))
    {
        wreply = wtrealm + "Logout";
    }
    else
    {
        wreply = wtrealm + "/Logout";
    }

    // Read the ACS Ws-Federation endpoint from web.Config
    // something like "https://<your-namespace>.accesscontrol.windows.net/v2/wsfederation"
    string wsFederationEndpoint = ConfigurationManager.AppSettings["ida:Issuer"];

    SignOutRequestMessage signoutRequestMessage = new SignOutRequestMessage(new Uri(wsFederationEndpoint));

    signoutRequestMessage.Parameters.Add("wreply", wreply);
    signoutRequestMessage.Parameters.Add("wtrealm", wtrealm);

    FederatedAuthentication.SessionAuthenticationModule.SignOut();

    string signoutUrl = signoutRequestMessage.WriteQueryString();

    return this.Redirect(signoutUrl);
}

10-08 06:53