2012-11-27 64 views
2

我已被分配到查找在我們的產品中實現SSO的方法。我們有幾個Winform應用程序和一個asp.net 4.0 web應用程序(而不是MVC)。單點登錄WinForms應用程序和asp.net wep應用程序

所有產品都使用.Net 4.0構建,Web應用程序爲ASP.NET 4.0。一些Winforms通過web服務(asmx)與我們的API進行通信,一些則直接使用我們的API。 Web應用程序也使用相同的API。我們提供一組使用相同API的外部客戶端的Web服務(asmx)。

目前,我們已經在我們的系統,我們自己的身份認證實施方案(用戶名,密碼,角色),我們想更換與SSO。或者這兩種認證制度可以以某種方式共存? Winforms在Intranet中使用,Web應用程序在Intranet中使用,我們還託管客戶端的Web應用程序(可從Internet訪問)。

的用戶在我們的系統中創建的,但在同一時間,我們用我們自己的工具導入用戶從Active Directory。活動目錄實際上是主要的用戶來源。

我已閱讀關於Windows身份基礎和我不知道我是否可以使用它來實現SSO。但我不明白的是,如何在Winform應用程序中直接使用API​​時使用WIF。

我想達成什麼是從系統中刪除所有的用戶管理和使用Active Directory作爲用戶來源。我想這意味着使用ADFS 2.0創建索賠等

我可以使用.Net框架4.5在此實現(我知道,WIF現在在.Net框架4.5中的頭等公民)。

你有什麼建議如何做到這一點? WIF是在Winforms應用程序和Web應用程序之間實現SSO的最佳選擇嗎?

回答

6

有一種方法可以從WinForms應用程序中獲取WIF身份驗證Cookie。

要做到這一點,你就舉辦WebBrowser控制並將其指向你的Web應用程序的登錄頁面。假設Web應用程序與ADFS2聯合,Web瀏覽器控件將自動遵循流程 - 它將重定向到ADFS並在那裏停止顯示用戶憑據的提示(在Forms Authentication模式下顯示ADFS2),或僅使用NTLM/Kerberos進行身份驗證(在Windows身份驗證模式下的ADFS2)。然後,Web瀏覽器將重定向回您的應用程序。

這是你鉤住你的代碼的地方。您只需向Web瀏覽器的導航事件添加處理程序,然後在ADFS2.0驗證用戶身份後,檢查它何時返回到您的應用程序。然後,您可以在WinForms應用程序中調用InternetGetCookie方法來獲取應用程序發出的所有身份驗證Cookie,並且可以關閉託管Web瀏覽器的窗口。

在這一點上,你必須WIF發佈了應用程序的所有身份驗證Cookie(在SessionAuthenticationModule)。您現在可以調用您的應用程序Web服務並將Cookie注入http調用。 Web服務器將正確識別用戶身份,這意味着您所要做的就是爲您的Web服務添加適當的授權(您的Web方法應該執行PrincipalPermission)。

另一種方法是從Web應用程序中公開WCF服務,並使用WS-Federation主動身份驗證來保護它們。這種方法的缺點是(在我看來),如果你的身份提供者(ADFS)進一步與另一個不需要實現WS-Trust/WS-Federation的身份提供者聯合,那麼主動身份驗證可能會失敗(因爲另一個身份提供者身份提供者並沒有實現它),而被動場景仍然可以工作(一組重定向會在稍後結束,並且需要用戶提供憑證的頁面,但連續身份提供者之間的身份驗證協議流並不重要)。

+0

非常徹底的答案,Wiktor :)所以沒有WebBrowser控件的Winforms沒有辦法使用WIF?最好的方法可能是重構所有Winform應用程序以使用WCF服務,並讓WIF從那裏開始工作? – OKB

+0

我不確定活動場景(通過WCF的WIF)是否更好。假設ADFS與另一個自定義STS聯合,然後通過Oauth2與Google聯合。被動場景會輕鬆處理(這只是少數重定向問題),但活動場景將失敗。在我們的系統中,我們決定採用被動方案,我們在我們的勝利形式應用程序中託管網絡瀏覽器,我們捕獲本地身份驗證cookie並向cookie提供Web服務代理,以便服務器將勝利表單應用程序識別爲已驗證身份。它現在工作了2年,沒有重大問題。 –