我正在开发一个必须与受 SSO Shibboleth 身份验证保护的网站进行强烈交互的 Android 项目。因此,我必须创建一个 Java 类,以便做出有效的 SAML 断言并登录网站。
我用谷歌搜索了很多,我找到了这段代码: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) 和查询字符串 (/home.do;jsessionid=XXXFAEC60AXXX7A7B9XXXAA9EXXXE71X.jvm2c) 重新连接了我,但我认为这可能完全出错了。
如何通过 Java 登录 SAML 认证网站?
另一个(边际)问题:我在没有加密(https)的情况下执行了所有请求。从安全性(数据包嗅探等)的角度来看,这可能是一个问题吗?