在SSO环境中,虽然用户帐户维护在IdP,但某些服务提供商确实维护具有活动用户帐户的数据库.现在,如果用户在IdP处停用,那么将该信息传递给仍然将该用户作为其数据库中的活动用户的相应SP的最佳方法是什么?
在浏览SAML-profiles文档后,我找到了名称标识符管理配置文件,其中IdP可以通知SP关于特定标识符/用户的终止.
这是SP和IDP应该实现的正确配置文件(它是否易于实现?)还是有其他简单的方法来实现这一目标吗?任何建议都非常感谢.
谢谢,
Abhilash
在我们目前的情况下,我们的基于Web的应用程序(SP)已经使用Spring Security SAML扩展集成了SSO.我们的产品是SaaS,我们有不同的客户,他们可能在其末端配置了不同的IDP(身份提供商).现在我们正在努力为我们的移动应用程序提供SSO支持.
经过一番搜索,我遇到了3个可以实现的解决方案:
1)使用Web视图:当为客户端启用SAML时,移动应用程序将嵌入Web视图,该视图在打开移动应用程序时呈现IDP登录页面.将触发SP侧的URL,这将触发SAML重定向回IDP.因此,webview将执行SP发起的登录流程.但是,由于webview不使用cookie空间,因此每次应用程序被终止或会话过期时,用户都必须登录该应用程序.另外由于webview不是浏览器,我已经读过它在HTTP重定向期间可能无法处理边缘情况.
2)使用Native SSO App:IDP通常提供本机SSO应用程序,移动应用程序可以登录IDP.移动应用程序可以通过相应IDP提供的SDK与IDP的本机应用程序进行交互.但由于我们的移动应用程序应该能够支持许多IDP的SSO,如果我们遵循这种方法,我们可能必须为每个IDP集成多个Native SSO应用程序.我不确定这在我们的场景中是否合理
3)使用OAuth和SAML:第三个选项是为我们的移动应用添加OAuth支持.Salesforce等IDP支持OAuth授权移动应用,但我不确定所有IDP是否支持OAuth,以及为移动应用实施OAuth和SAML有多困难.
谁能告诉我在上面的场景中哪种方法更可取,还是有更好的方法我没有考虑过?有什么建议?
非常感谢!
我使用Spring SAML实现了SSO,一切正常.它与以下IDP一起使用到现在为止:1)idp.ssocircle.com 2)openidp.feide.no
现在我正在使用salesforce.com作为我的身份提供商进行测试.由于没有上传服务提供商元数据的规定,我在其IdP上完成了以下配置设置:
给我的entityID和Assertion Consumer Service URL.我还上传了我的SP证书.我已经下载了它的元数据(idp元数据),如下所示(隐藏敏感信息):
<?xml version="1.0" encoding="UTF-8"?><md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="https://ABC-dev-ed.my.salesforce.com" validUntil="2024-04-11T13:55:57.307Z">
<md:IDPSSODescriptor WantAuthnRequestsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<md:KeyDescriptor use="signing">
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>XXXXXXXXX</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</md:KeyDescriptor>
<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://ABC-dev-ed.my.salesforce.com/idp/endpoint/HttpPost"/>
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://ABC-dev-ed.my.salesforce.com/idp/endpoint/HttpRedirect"/>
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试测试我的SP时,首先它将我重定向到IDP(salesforce),询问我输入的凭据,但之后我被重定向回我的Assertion消费者服务URL(这是我的SP)但这里有例外生成了这样说
HTTP状态401 - 此请求需要HTTP身份验证(身份验证失败:传入SAML消息无效).
我尝试了以下但没有工作:( - 虽然没有必要,但我已经从salesforce下载了证书文件并将其导入我的keystore.jks,以确保该密钥用于签名验证.(由于IDP元数据中已存在证书信息,因此不必要).
这是我在日志文件中找到的内容(仅在成功的AuthnRequest之后添加必要的信息):
AuthNRequest;SUCCESS;127.0.0.1
.....STARTED_FAILING_HERE.....
Attempting to extract credential from an X509Data
Found 1 X509Certificates
Found 0 X509CRLs
Single certificate was present, treating as end-entity certificate
Credentials successfully extracted from child {http://www.w3.org/2000/09/xmldsig#}X509Data by provider org.opensaml.xml.security.keyinfo.provider.InlineX509DataProvider
A total of 1 credentials were resolved …Run Code Online (Sandbox Code Playgroud) salesforce spring-security single-sign-on saml-2.0 spring-saml
我已经使用 Spring Security SAML 实现了 SSO。这是目前对我有用的内容:
当我尝试访问 SP 上的任何资源时,如果我尚未登录,我将被重定向到我的 IdP(在我的情况下为 idp.ssocircle.com)。在 IDP 成功验证后,我被重定向回 SP 并授权传入的 SAML 响应并为相应的用户创建会话。一切都很酷,直到这里!但是,当我从 IDP 注销(通过从外部单击 idp.ssocircle.com 注销)时,我应该无法访问我的 SP,这在我的情况下没有发生。现在我想做的是编写一个新的过滤器,在处理 SP 上的任何请求之前检查 IDP 上的有效会话。我已经搜索了很多,但找不到任何解决我的问题的方法。
请提供有关如何实现此过滤器的输入,或者是否有其他方法可以做到这一点?任何建议表示赞赏。
我开始知道,在任何SSO解决方案中,如果SP需要任何其他属性,它可以使用AttributeConsumingService参数在元数据中发布它们.现在可以添加所需的属性,如下所示:
<md:AttributeConsumingService index="0"
xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
<md:ServiceName xml:lang="en">ABC</md:ServiceName>
<md:ServiceDescription xml:lang="en">ABC</md:ServiceDescription>
<md:RequestedAttribute isRequired="true"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
Name="urn:oid:2.5.4.42"
FriendlyName="FirstName"/>
</md:AttributeConsumingService>
Run Code Online (Sandbox Code Playgroud)
现在,如果我想在我的SP元数据中添加自定义属性,让我们说"用户"的"角色",我该如何将其添加到元数据中?我的意思是,它的名称是什么(这是我无法找到的!),NameFormat(它是urn:oasis:names:tc:SAML:2.0:attrname-format:uri?)和FriendlyName(我能给出吗?)它在这里作为"角色"?).我在SAML2Core文档中找不到任何与此相关的内容.
有任何建议请!
谢谢,
Abhilash
我最近开始阅读有关 SAML 的内容,并尝试在我现有的 Java 应用程序中实现类似于 Spring 的 SAML 示例项目的内容(所以如果我问一些愚蠢的问题,请原谅我!)。我现有的应用程序有一个 Login.jsp,它要求用户提供凭据并进行相应的验证以登录。我想为我的应用程序实现 SSO 的想法。首先,我已经很好地理解了 Spring Saml 示例项目。在其 SecurityContext.xml 中,samlIDPDiscovery bean 配置为:
<!-- IDP Discovery Service -->
<bean id="samlIDPDiscovery" class="org.springframework.security.saml.SAMLDiscovery">
<property name="idpSelectionPath" value="/WEB-INF/security/idpSelection.jsp"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
idpSelection.jsp 具有以下 html 部分代码:
<h1>IDP selection</h1>
<%
WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletConfig().getServletContext());
MetadataManager mm = context.getBean("metadata", MetadataManager.class);
Set<String> idps = mm.getIDPEntityNames();
pageContext.setAttribute("idp", idps);
%>
<p>
<form action="<c:url value="${requestScope.idpDiscoReturnURL}"/>" method="GET">
<table>
<tr>
<td><b>Select IDP: </b></td>
<td>
<c:forEach var="idpItem" items="${idp}">
<input type="radio" name="${requestScope.idpDiscoReturnParam}" id="idp_<c:out value="${idpItem}"/>" value="<c:out value="${idpItem}"/>"/>
<label for="idp_<c:out value="${idpItem}"/>"><c:out value="${idpItem}"/></label>
<br/> …Run Code Online (Sandbox Code Playgroud) 我已经使用 spring SAML 实现了 SSO,我想知道是否有任何方法可以请求 IDP(在我的例子中为ssocircle.com)向我发送其他属性以及它已经发送的 nameID。假设我希望 IdP 向我发送已成功通过身份验证的人员的 accountID。我进行了很多搜索并找到了一些建议,例如:
重写WebSSOProfileImpl .java 中的getAuthnRequest方法,以便发送到 IdP 的 authnRequest 具有此属性集。但我不知道如何继续下去?我是否也必须使用此附加属性名称和格式修改我的 SP 元数据?如果是,我该怎么做?或者可以使用 RelayState 参数来完成某些操作吗?在这方面的任何帮助将不胜感激。
谢谢,
阿比拉什