3

Facebook 开发者政策的第 6 条规则说我必须提供一个明确的注销链接,但我无法让它工作。

我的目标是让我的应用程序退出 Facebook、用户退出整个 Facebook 体验环境,或者两者兼而有之。到目前为止,我不能做任何这些。

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

尝试 1:Facebook OAuth 注销

 "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 重定向回我的网站?

4

3 回答 3

2

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

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

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

  • ACS 识别来自身份提供者的 wsignoutcleanup1.0 消息,并通过向依赖方应用程序发送 wsignoutcleanup1.0 消息来响应。

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

代码示例:ASP.NET MVC 4 with Federated Sign-out 中,执行如下操作以从 ACS 中注销:

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

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);
}
于 2013-03-15T17:33:22.583 回答
0

一般来说,联合注销有两到三个步骤 - 如果使用了表单身份验证 cookie 和 FIM cookie,则需要在本地删除,这将从本地应用程序中注销。

然后,您需要向所使用的 STS 发出 wasignoutcleanup10 请求,这将使您从 STS 本身注销,理论上,应该向该过程中涉及的所有其他 IP( STS 应跟踪每个请求联系了哪些 IP)

我曾经使用具有所需组件的 Windows Identity Foundation 构建了这样的场景,但它确实需要一些开发来跟踪所有 IP 并发出调用。

我怀疑 ACS 目前不支持这种行为,这意味着用户必须关闭浏览器才能完全退出所有应用程序。

于 2011-11-27T07:43:27.893 回答
0

正如这篇文章所建议的:Azure AppFabric Access Control Service Log Off,您可以创建一个自定义注销按钮,然后只需单击该按钮即可调用 ederatedAuthentication.WSFederationAuthenticationModule.SignOut 方法。然后 ACS 应该为您处理注销过程。

于 2011-10-06T06:26:55.840 回答