2011-03-31 192 views
70

上午每個人,如何成爲SAML服務提供商

我的公司目前正在開發Java Web應用程序。我們的幾個客戶擁有內部SAML服務器(身份提供商?),並要求我們與他們進行整合。所以最近我一直在讀它,並與OpenAM一起玩。大約3天后,我對此有了一個大概的瞭解,但是我的知識還有一些差距。我希望有人能爲我解決這個問題。

因此,這裏是我如何想象一個用戶登錄的工作流程。

讓我們來定義我們的客戶SAML服務器https://their.samlserver.com。因此,用戶來到我們的Web應用程序以獲取受保護的資源。假設這個URL是http://my.app.com/something

所以,如果我是正確的,my.app.com是什麼SAML定義爲服務提供商。我們的應用程序來實現,這需要用戶登錄。然後,我們提出一個頁面像這樣給用戶...

<script>JQuery Script to auto submit this form on ready</script> 
<form method="post" action="https://their.samlserver.com/Post/Servlet"> 
    <input type="hidden" name="SAMLRequest" value="someBase64Data" /> 
    <input type="submit" value="Submit" /> 
</form> 

someBase64Data本應是base64編碼版本...

<samlp:AuthnRequest 
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
    ID="identifier_1" 
    Version="2.0" 
    IssueInstant="2004-12-05T09:21:59Z" 
    AssertionConsumerServiceIndex="0"> 
<saml:Issuer>http://my.app.com</saml:Issuer> 
<samlp:NameIDPolicy 
    AllowCreate="true" 
    Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/> 
</samlp:AuthnRequest> 

所以我的第一對夫婦的問題。

什麼是ID值假設是?

爲什麼我可以宣佈自己爲發行人

身份提供商知道我嗎?也許這就是這樣信任圈

我一直在看到OpenAM。如果它瞭解我,它是如何知道我的,它需要知道什麼?

因此,在用戶轉發該頁面後,他們被帶到由IDP https://their.samlserver.com提供的頁面。他們在該頁面進行身份驗證,IDP確實驗證身份驗證並查找用戶。身份驗證成功後,IDP會發回<samlp:Response>定義的here

還有幾個問題。

首先,<samlp:Response>如何返回到我的web應用程序,以便我可以檢查它?

我應該在那個迴應中尋找什麼證明它是成功的?失敗是什麼樣子的?

我們目前使用電子郵件地址(LDAP)來識別用戶,所以我們可能會從響應中獲取該信息,並以我們現在使用的方式使用該地址。還有什麼我應該留意的迴應?

因此,現在我們已經檢查了該響應的有效性,我們可以授予用戶一個像我們目前所做的那樣的會話。但是,當他們想要註銷時,是否有工作流程?我是否必須通知IDP該用戶已離開?

最後,在我的閱讀中出現了幾個主題,我不確定它們如何適用於此工作流程。他們是信任圈,令牌文物

感謝任何幫助大家。在過去的幾天裏,我發現了很多信息,並且有可能在多玩一局之後將它們拼湊在一起。但我還沒有找到一個直接的「這是郵政」工作流程文章。也許這是因爲我錯了它的工作原理。也許這是因爲這還不是那麼受歡迎。但我真的很想確保我獲得了工作流程,所以我沒有錯過與用戶身份驗證一樣重要的關鍵步驟。

+2

我現在正在經歷同樣的問題(研究如何創建與Ping身份進行交互的輕量級聯合SAML v2服務提供程序)。你介意評論它是如何解決你的嗎?你最終使用一個fedlet或寫你自己的代碼?謝謝! – theglauber 2012-09-11 22:24:29

+0

我的環境有點類似。我有一個運行在tomcat上的基於java的web應用程序,現在我必須使用SAML來執行SSO。除了理論知識以外,我不知道這些技術。任何人都可以幫助我從頭開始配置嗎? – Jerry 2016-10-14 13:06:35

回答

42

針對您的具體問題:

1)什麼是應該是「ID」值?

  • 這應該是SAML請求的唯一標識符。在SAML 2.0規範規定,它是真正具體如何做到這一點的實現,但提出以下建議:

由一個SAML系統實體保證 標識符是唯一留下來的執行情況的機制。在採用隨機或僞隨機技術的情況下,隨機選擇的兩個標識符相同的概率必須小於或等於 至2^-128,並且應該小於或等於2^-160的長度。 這個要求可以通過編碼128到160位長度的隨機選擇值 來滿足。

2.)IdP如何瞭解您?

  • 您的SP需要註冊到IdP。爲了實現這一點,SAML規範定義了一個「SAML元數據」的格式,告訴IdP您的SAML接收器在哪裏,您的證書是什麼,您交換的屬性等等。OpenAM可能規定了配置可信SP的一些最低要求。這在每個產品中都不相同。

3.)響應去哪兒了,要檢查什麼?

  • 的響應會去你的斷言使用者服務URL通常在SAML元數據從與的IdP進行初始設置您的SP交換定義。當您收到SAML響應時,您需要檢查許多事情 - 但最重要的是,SAML狀態代碼應爲「成功」,inResponseTo ID應與請求發送的ID匹配,並且您必須驗證斷言上的數字簽名。爲此,您需要信任IdP的公開驗證證書,並且您可能還需要進行吊銷檢查。

4.)退出怎麼辦?

  • SAML 2.0還定義了Single LogOut(SLO)的配置文件。這不僅會使您退出SP,還會讓您註銷IdP以及您與其他SP建立會話的其他SP。它具有與單點登錄(SSO)類似的請求/響應流程,因此可以設置和檢查類似的內容(狀態碼,簽名等)。

因此總之 - 從零開始實施起來可能相當複雜。最好使用經過驗證的&真正的庫和/或像伊恩所建議的產品。像他這樣的公司已經投入了數百小時的開發時間來按照規範實施並測試與其他供應商的互操作性。

+2

爲什麼在saml請求中應該有一個ID。我不明白。 – Ashwin 2012-03-27 05:46:45

+1

它是SAML 2.0核心規範的一部分。請參閱http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf。 AuthnRequest的類型是AuthnRequestType(3.4.1節),它是RequestAbstractType(3.2.1節)的擴展,它具有強制的ID屬性。請求中ID的主要優點之一是響應可以引用它,因此SP可以將兩者映射在一起以防止重播。 – 2012-03-27 13:03:14

+0

你說ID是防止重放攻擊。如果我在服務提供者和IDProvider之間使用ssl/https連接,可以防止重放攻擊。 – Ashwin 2012-03-28 04:45:49

2

如果您只是想將一個Java應用程序設置爲服務提供程序,則應考慮使用來自Oracle(作爲獨立版)或ForgeRock(與OpenAM捆綁在一起)的Fedlet。 ForgeRock Fedlet有一些與Shibboleth 2.2.1作爲身份提供者交互的問題,但我覺得配置和提供更多信息會更簡單。

每個README中都有明確的說明以幫助您進行部署。一旦Fedlet配置完成並與IDP通信,成功頁面會顯示將聯合SSO集成到應用程序中所需的所有代碼。它負責發送和接收AuthnRequests和Responses的後臺工作。

Scott的回答對您所提出的問題做出了很好的迴應,但我認爲嘗試自行編寫生成SAML的代碼正在重新發明輪子。 Fedlet的設計正是考慮到這個用例。