使用 Azure 的 ACS 时如何注销 Facebook?

Posted

技术标签:

【中文标题】使用 Azure 的 ACS 时如何注销 Facebook?【英文标题】:How do I log out of Facebook when using Azure's ACS? 【发布时间】:2011-12-02 00:07:53 【问题描述】:

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

【问题讨论】:

似乎 GET 到 /Logout 不再有效... social.msdn.microsoft.com/Forums/en-US/windowsazuresecurity/… 【参考方案1】:

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

使用 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 并重新回复来自信赖方的消息 应用程序并通过向身份发送 wsignout1.0 消息来响应 提供者和 wsignoutcleanup1.0 消息到依赖方 应用程序。

从Code Sample: 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);

【讨论】:

【参考方案2】:

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

【讨论】:

该代码使 FAM cookie 过期,但不会重定向到提供程序...至少在我基于示例 MVC 本地表单登录的设置中没有【参考方案3】:

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

然后,您需要向所使用的 STS 发出 wasignoutcleanup10 请求,这将使您从 STS 本身中注销,并且理论上,应该向参与其中的所有其他 IP 发出 wasignoutcleanup1.0 请求(或等效请求)流程(STS 应该跟踪每个请求联系了哪些 IP)

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

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

【讨论】:

以上是关于使用 Azure 的 ACS 时如何注销 Facebook?的主要内容,如果未能解决你的问题,请参考以下文章

csharp 注销ACS

具有 ACS 身份验证的 azure 开发中的跨域 cookie

您可以在 azure acs 中同时拥有客户端证书安全性和服务身份认证吗

在 Windows 8 上使用 Microsoft 帐户的 Azure ACS 2.0

如何使用 Azure Cognitive Face API 验证两个图像?需要示例代码

当存在要注销的多个帐户时,使用 SimpleSAMLphp 注销到 Azure AD 中的指定网站后不会发生重定向