当前位置: 首页 > 知识库问答 >
问题:

如何通过有效的SAML 2.0断言登录?

牟飞沉
2023-03-14

我正在开发一个Android项目,该项目必须与受SSO Shibboleth身份验证保护的网站强烈交互。因此,我必须创建一个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它所做的最后一件事是获取SAMLACK参数的值,即元素的base 64编码。然后它向断言消费者服务发出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请求,我以为服务器通过cookies(JSESSIONID)和查询字符串(/home.do;jsessionid=XXXFAEC60AXXX7A7A7B9XXAA9EXXXE71X.jvm2c)重新确认了我,但我认为也许有些地方完全出错了。

如何通过 Java 登录经过 SAML 身份验证的网站?

另一个(边缘)问题:我在没有加密(https)的情况下执行了所有请求。从安全性的角度来看(数据包嗅探等),这会是一个问题吗?

共有1个答案

酆耀
2023-03-14

不幸的是,我无法想象你到底有什么问题。我只能将您重定向到Shibboleth网页,这可以在ShibbolethWorkflow方面启发您。还有SAML配置文件的文档(第14页WB-SSO)。在使用单注销配置文件扩展应用程序期间,我发现它非常有用

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

编辑1:至于html" target="_blank">示例代码,请查看Guanxi(Java中的Shibboleth实现),也许你会帮助你

 类似资料:
  • 我想添加一个监视器来检测不正常的服务,并在这种情况下发送警报。我已经公开了一个简单的REST API - ,它返回一个JSON,例如。 然后,我已将 添加到我的 site24x7 帐户,将内容检查响应格式设置为 JSON,现在我应该提供要断言的 JSONPath。 在JSONPath在线测试器中,当我使用时,我得到。但我想我应该尝试断言该返回值。 使用以下表达式不起作用 我想我应该使用或过滤来评估

  • 嗨,我有一个testNG类,它包含和语句。执行之后,我无法在生成的HTML报告中找到这些通过和失败的结果。我搜索了一下,发现这些可能不会显示在生成的报告中。所以我的问题是,如果testNG报告不提供此特性,那么在执行测试后,是否有其他报告可以在报告中找到这些数据?

  • 在使用ADFS执行SSO验证时,我的Spring Boot应用程序有时会显示以下错误。ADFS超时设置为1小时,应用程序超时设置为4小时。来自fiddler trace的响应日志是加密格式的。在spring security完成解密后,有没有方法在日志中打印响应?如何在spring saml与ADFS集成中禁用加密。 在java.base/java.util.concurrent.ThreadPo

  • 在下面的json有效负载中,我如何通过空手道断言D节点不在响应中。

  • 7.12. 通过类型断言询问行为 下面这段逻辑和net/http包中web服务器负责写入HTTP头字段(例如:"Content-type:text/html)的部分相似。io.Writer接口类型的变量w代表HTTP响应;写入它的字节最终被发送到某个人的web浏览器上。 func writeHeader(w io.Writer, contentType string) error { if

  • 问题内容: 我在Web应用程序中使用Spring Security,现在我想获得一个已登录程序的所有用户的列表。 我如何访问该列表?他们不是已经在Spring框架中保留了什么吗?像SecurityContextHolder或SecurityContextRepository吗? 问题答案: 要访问所有已登录用户的列表,需要将SessionRegistry实例注入到bean中。 @Autowired