2014-10-03 32 views
0

我有3個使用SQL-Server上的Entity Framework運行的ASP.NET MVC網站。每個站點都作爲獨立數據庫的獨立應用程序運行。我希望讓商業客戶創建「護照」又名代幣,讓他們登錄到一個網站,同時登錄到其他網站。爲了登錄網站,護照必須通過護照系統發出有效的「簽證」,護照可以由護照網站管理員管理,管理員可以使用該網站管理員訪問網站A,B,和C和做管理員的東西。從某種意義上說,護照可以被認爲與人們的真實身份具有一一對應的關係。使用單一「護照」進行多點登錄

passport diagram

這裏是我的問題,我該如何通過從網站A的用戶登錄嘗試與護照數據庫檢查,並將結果返回到網站?我如何保持此通訊隱藏?換句話說,只有網站應用程序A,B,C可以檢查護照數據庫的登錄嘗試嗎?應該有另一個提供該界面的應用程序嗎?它會是一個ASP.NET Web API嗎?

我的問題的第二部分,一旦用戶登錄到站點A,他們不應該重新鍵入他們的憑據以進入站點B和C.相反,登錄到站點A時,他們創建與站點B和C的會話,或者生成一個可以授權與站點B和C進行會話的密鑰。這個過程會是什麼樣子?

我不是在尋找一個完整的解決方案,但如果你能指點我一個例子,朝着技術/庫/對象的文檔,我會覺得有用。

回答

1

你在找什麼在Windows Identity Foundation有貨。仔細查看網站上的開發人員工具包,您想要的內容相當容易完成。

您的「護照站點」被稱爲安全令牌服務(STS)。網站A,B和C被稱爲依賴方(RP)。考慮一個使用ADFS 2.0實現STS的簡單情況(所有用戶都在Active Directory中維護)。 Windows Identity Foundation(WIF)具有ASP.NET身份驗證模塊,可以通過SAML使用ADFS 2.0來開箱即用。 STS以「Claim」形式表示用戶信息,並創建一個包含所有聲明的X509簽名令牌,並將該令牌作爲cookie提供給用戶。 RP可以讀取令牌,驗證簽名並將其用於身份驗證和授權。

樣本流程解釋如下:

a。用戶訪問的網站A第一次

  1. WIF模塊檢查cookie的有效標記。由於用戶尚未登錄,因此沒有令牌。
  2. WIF使用特殊的URL來傳遞誰的意圖(登錄/註銷,RP名稱等),將用戶瀏覽器的HTTP重定向到STS站點。
  3. STS站點檢查令牌並且由於它不存在,顯示登錄頁面。
  4. 用戶登錄並獲得用戶聲明的令牌。還有第二個特定於RP名稱的標記(這表示RP的登錄)。 STS重定向回請求RP。
  5. 網站A上的WIF模塊現在可以識別該令牌並將其用於AuthN和AuthZ。

b。現在考慮用戶訪問網站B.

  1. WIF模塊會檢查有效令牌。由於它不存在,所以沒有令牌。
  2. WIF再次使用不同的參數重新定向到STS(RP已更改)
  3. STS檢查登錄令牌。由於用戶已經登錄,它是存在的。
  4. STS創建的網站B的令牌和重定向回網站B.
  5. 網站B WIF模塊識別標記並用它來AuthN和AuthZ的

用戶不必再次登錄與他的用戶名和密碼。

該系統的複雜性在於處理單個站點註銷並在多個RP之間通過用戶進行通信註銷。當整個系統依賴它時,還需要維護正確的SSL證書。

某些情況下還有一個「活動」情形(我描述的情況是「被動」,瀏覽器在所有情況下都運行),程序員必須對重定向進行編碼。