0

我正在开发一个必须与受 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)的情况下执行了所有请求。从安全性(数据包嗅探等)的角度来看,这可能是一个问题吗?

4

1 回答 1

0

不幸的是,我无法想象您的确切问题是什么。我只能将您重定向到Shibboleth 网页,它可以在 shibboleth 工作流程方面对您有所启发。还有SAML 配置文件的文档(第 14 页 WB-SSO)。在使用 Single Logout Profile 扩展我的应用程序时,我发现它很有帮助

至于缺少 https ......这是一个重大的安全漏洞。完全使用 Shibbolethh 或 WBSSO 的目的是为资源和可靠的用户信息提供最大程度的保护。首先,您需要与 IdP 进行安全的登录凭据交换。其次,如果有人嗅探签名(甚至可能加密)的断言,idp 将其发送回您的应用程序,他可能无法从中获取用户信息(由于加密),但只要断言,他就可以访问您的安全服务有效(5 分钟、15 分钟甚至几个小时 - 取决于 IdP 配置)

编辑 1:至于示例代码,请查看Guanxi(Java 中的 Shibboleth 实现),也许它会对您有所帮助

于 2013-03-08T10:46:37.860 回答