我有一个Restful Java Web应用程序,它将部署到许多不同的环境(我无法控制),这些环境将使用SAML 2.0 SSO解决方案。
我的应用程序(我认为是“服务提供商”)需要存储用户生成的状态,并使用内部业务逻辑来确定允许哪些用户查看或更新其他用户的数据。为了实现这一点,我们需要知道用户是谁,以及用户属于哪些组。但是我如何获得这些信息?
理想情况下,我的网络应用程序将与SSO无关,并且会在http请求中查找一些可配置的密钥标头以获取此信息,例如可以解析的请求中的SAML令牌,或者某些特定于我的“服务提供商”的自定义标头。
非常感谢
答案 0 :(得分:1)
您是对的,您的应用程序是服务提供商,您将拥有一个外部身份提供商(IdP)进行身份验证。
基本上您需要向IdP发出身份验证请求(通过前端HTTP POST或反向信道SOAP /他们支持的任何内容)并使用IdP中的authenticationResponse来决定他们是否是他们所说的人。作为一项规则,您应该能够从authnResponse获取主题(即用户名)和任何组成员资格,但是具体如何工作将取决于IdP是或未配置的内容。
在您执行此操作之前,您需要使用IdP交换SAML元数据(这通常是使用IdP注册为SP的一部分),这为双方提供了用于签名和验证请求的公共X509证书。
SAML SP支持有一个很好的弹簧库,http://docs.spring.io/autorepo/docs/spring-security-saml/1.0.x-SNAPSHOT/reference/htmlsingle
答案 1 :(得分:0)
您可以在Java Web应用程序前运行反向代理来处理SSO协议部分并将用户身份信息中继到HTTP头中的应用程序;对于SAML 2.0,有mod_auth_mellon:https://github.com/UNINETT/mod_auth_mellon
答案 2 :(得分:0)
如果这是在Java中完成并在webcontainer(Tomcat,JBoss等)上运行,那么代理可以实现为Web身份验证(servlet)过滤器(添加到web.xml中)。用户通常将从SAML Auth响应的< saml:NameID>中获得。或者来自< saml:Attribute>匹配userid属性(uid,电子邮件等)。应该针对Web应用程序的标识存储库(可以是LDAP,数据库等)和计算的相应组来验证此用户。不要为经过身份验证的用户使用任意标头或自定义表示,请考虑在主题中使用java Principal (对于用户和组)。 然后,过滤器可以在 Subject.doAs()中运行过滤器链的其余部分。这样,可以使用 Subject.getSubject()在下游代码中的任何位置查找 Subject 。