2013-03-05 50 views
0

我正在開發一個Android項目,該項目必須與SSO Shibboleth身份驗證受保護網站進行強烈交互。因此,我必須創建一個Java類來創建有效的SAML斷言並登錄到網站。如何登錄有效的SAML 2.0斷言?

我GOOGLE了很多,我覺得這一段代碼:http://blog.keksrolle.de/2010/07/27/how-to-create-a-valid-saml-2-0-assertion-with-opensaml-for-java.html 其實我發現並不需要它,因爲我是能夠獲得通過一些HttpConnection的請求,SAML響應。

我寫的代碼能夠執行步驟這個名單的1-5:http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language#The_SAML_Use_Case 它確實是越來越SAMLResponse參數,這是一個元素的Base64編碼的值的最後一件事。然後它向斷言消費者服務發出POST請求。 這裏僞代碼

/* discover the IdP */ 
connect to the link (/idp/login/) which redirects to the form page (/Authn/UserPassword) 
get cookies from the link in order to gain access to the form page 
/* end */ 
/* get SAML response climbing the redirects */ 
set goTo var to the link of the form page 
do { 
    send POST data (+ cookies) to the goTo page 
    get cookies of the new page and saves them with the others 
    set goTo to connection.getHeaderField("Location"); 
} while (!(responseCode==200)); 
read the source of the last redirect 
get the specific SAMLResponse 
/* end */ 
send it to website.com/Shibboleth.sso/SAML2/POST 
get cookies, session data 

但後來服務器的響應是一個500錯誤代碼,或在頁面錯誤代碼(「出事了重試。」)。 事實上,即使我有一個有效的SAML斷言(我向服務器發送(編碼)),我也無法獲得會話的訪問權限。 這是會話的問題嗎?一旦我發佈POST請求,我認爲服務器通過cookie(JSESSIONID)和querystring(/home.do;jsessionid=XXXFAEC60AXXX7A7B9XXXAA9EXXXE71X.jvm2c)重新整理了我,但我認爲這可能是完全錯誤的。

如何通過Java登錄SAML認證網站?

另一個(邊際)問題:我執行了所有沒有加密的請求(https)。從安全的角度來看,這可能是一個問題(數據包嗅探等)?

+0

您是否解決了您的問題?如果我可以問,你是怎麼做到的? – 2013-05-13 01:56:48

+1

請參閱:http://stackoverflow.com/a/15731858/1557941 – Gianluca 2013-05-13 18:13:32

+0

謝謝你的迴應,我很高興它爲你工作。我只是想問,你碰巧使用任何外部Java庫,並解決涉及比你上面描述的一個不同的方法,並沒有手動創建自己的主張? – 2013-05-17 16:29:59

回答

0

不幸的是我無法想象你的確切問題是什麼。我只能將你重定向到Shibboleth Web page,這可以在shibboleth工作流程方面給你帶來啓發。 SAML配置文件也有documentation(第14頁WB-SSO)。在使用單一註銷配置文件擴展我的應用程序期間,我發現它有幫助

至於https的缺乏......這是一個主要的安全漏洞。使用Shibbolethh或WBSSO的目的是爲資源和可靠的用戶信息提供最大限度的保護。 首先,您需要與IdP進行安全的登錄憑證交換。 其次,如果有人嗅探簽約(甚至是加密的)斷言,這IDP發回給你的應用程序,他可能無法從中獲得用戶信息(由於加密),但他可以,只要訪問受保護的服務斷言是有效的(5分鐘,15分鐘甚至幾夭小時 - 取決於的IdP配置)

編輯1: 至於示例代碼,請Guanxi(在Java中的Shibboleth實現),也許你會幫助你