使用Azure的ACS时如何退出Facebook?

时间:2011-10-06 05:33:56

标签: facebook oauth azure openid acs

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

3 个答案:

答案 0 :(得分:2)

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和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);
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

一般来说,联合注销有两到三个步骤 - 在本地您需要删除表单auth cookie(如果使用了一个以及FIM cookie),这将从本地应用程序注销。

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

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

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