2011-10-06 74 views
3

Rule #6 of the Facebook developer policy說我必須提供一個明確的註銷鏈接,但我無法使其工作。使用Azure ACS時,我如何註銷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重定向回我的網站?

+0

似乎是一個'GET'到/註銷不再工作... http://social.msdn.microsoft.com/Forums/en-US/windowsazuresecurity/thread/f92e24bc-e685-4709- 9e5e-7b203efef44b – LamonteCristo

回答

0

正如這篇文章表明:Azure AppFabric Access Control Service Log Off,您可以創建自定義註銷按鈕,只需調用按鈕的點擊ederatedAuthentication.WSFederationAuthenticationModule.SignOut方法。 ACS然後應該爲您處理註銷過程。

+0

該代碼到期是FAM cookie,但不執行重定向到提供程序...以及至少不是在我的基於樣本MVC本地表單登錄的設置中 – LamonteCristo

0

一般來說有兩個或三個步驟的聯合登出 - 本地您需要刪除窗體身份驗證cookie的,如果一個被用作還有FIM的cookie,這會從本地應用程序註銷。

然後,您需要向所使用的STS發出wasignoutcleanup10請求,這會將您從STS本身簽名出來,理論上講,應該向涉及到的所有其他IP發出wasignoutcleanup1.0請求(或等效)這個過程(STS應該跟蹤每個請求聯繫哪些IP)

我使用Windows身份基礎構建了這樣的場景,它具有所需的組件,但它確實需要一些開發來跟蹤所有的IP併發出呼叫。

我懷疑是ACS目前不支持這種行爲,這意味着用戶將不得不關閉瀏覽器從所有的應用程序完全註銷。

2

ACS的2012年12月更新包括聯合單點登錄了支持:

使用WS聯盟的協議。使用ACS來 Web應用程序能夠使用的 WS聯盟協議,現在可以利用單一登出 能力的優勢身份提供單點登錄(SSO)。當用戶退出Web應用程序時,ACS可以自動將用戶簽出身份提供商,並自動將其簽署給使用相同身份提供商的其他依賴方應用程序。

此功能啓用WS聯合身份提供者,包括 Active Directory聯盟2服務。0和Windows Live ID (Microsoft帳戶)。要啓用單點登錄時,ACS執行對WS聯盟協議端點 以下任務:

  • ACS從身份提供 識別wsignoutcleanup1.0消息,並通過發送wsignoutcleanup1.0消息給依賴方 應用程序響應。

  • ACS識別從依賴方 應用wsignout1.0和wreply消息,並通過發送wsignout1.0消息身份 提供商和wsignoutcleanup1.0消息依賴方 應用程序響應。

Code Sample: ASP.NET MVC 4 with Federated Sign-out,實現一個Action像下面從ACS登出:

(注:Windows標識基金會現已併入.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); 
}