我通过复制我计划连接的IDP的509条目生成了testIdp.cer文件.然后我通过执行以下命令创建了JKS文件
keytool -importcert -alias adfssigning -keystore C:\Users\user\Desktop\samlKeystore.jks -file C:\Users\user\Desktop\testIdp.cer
Run Code Online (Sandbox Code Playgroud)
执行时,它要求输入我已给出密码的密码.对于"信任这个证书?[no]:"这个问题,我给出了"y"作为输入.消息出现为"证书已添加到密钥库".
然后我在securityContext.xml中配置了以下详细信息
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
<constructor-arg value="classpath:security/samlKeystore.jks"/>
<constructor-arg type="java.lang.String" value="mypassword"/>
<constructor-arg>
<map>
<entry key="adfssigning" value="mypassword"/>
</map>
</constructor-arg>
<constructor-arg type="java.lang.String" value="adfssigning"/>
</bean>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="alias" value="adfssigning" />
<property name="signingKey" value="adfssigning"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
但是当我运行应用程序时,我在服务器启动时以及加载应用程序的主页时会遇到以下两个异常.如果我错过任何其他内容,任何人都可以告诉我.
启动服务器时发生此异常
Caused by: org.opensaml.saml2.metadata.provider.FilterException: Signature trust establishment failed for metadata entry
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.verifySignature(SignatureValidationFilter.java:327)
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.processEntityGroup(SignatureValidationFilter.java:240)
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.doFilter(SignatureValidationFilter.java:158)
at org.opensaml.saml2.metadata.provider.AbstractMetadataProvider.filterMetadata(AbstractMetadataProvider.java:493)
at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.processNonExpiredMetadata(AbstractReloadingMetadataProvider.java:395)
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序的主页时,会发生此异常
java.lang.UnsupportedOperationException: trusted certificate entries are not password-protected
at java.security.KeyStoreSpi.engineGetEntry(Unknown Source)
at java.security.KeyStore.getEntry(Unknown Source)
at org.opensaml.xml.security.credential.KeyStoreCredentialResolver.resolveFromSource(KeyStoreCredentialResolver.java:132)
Run Code Online (Sandbox Code Playgroud) 我正在使用Spring SAML实现.SSO圈元数据xml具有注销端点,有助于本地注销和全局注销.但是我还在与其他IDP进行交互,并且没有在其元数据xml中使用注销端点.
在这些情况下应该如何处理LOGOUT?
删除请求的cookie是此问题的唯一解决方案还是有针对此方案的解决方法?
非常感谢您在这方面的帮助.
我有一个使用 spring 安全基本身份验证的应用程序,它根据数据库验证用户详细信息。有一组特定的用户会根据 SSO 数据库进行验证。使用 SAML,我能够针对 SSO 数据库进行验证。
但问题是如何在单个应用程序中集成基本身份验证和 SAML 身份验证,并将用户定向到特定身份验证。另一个原因,两者都使用不同的身份验证提供程序。
我使用 spring-saml 示例来配置 SAML。
另一个问题是拦截 url 模式。在下面的配置中,两个安全配置都没有映射到 PATTERN 属性,因为服务器启动时出现异常,因为有两个配置映射到 /**(任何请求)。如何解决这个异常?
例如:
<security:http access-denied-page="/saml/web/metadata/login">
<security:form-login login-processing-url="/saml/web/login" login-page="/saml/web/metadata/login" default-target-url="/saml/web/metadata"/>
<security:intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<security:intercept-url pattern="/logout" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<security:intercept-url pattern="/home" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<security:custom-filter before="FIRST" ref="metadataGeneratorFilter"/>
</security:http>
<security:http pattern="/saml/mysignin" entry-point-ref="samlEntryPoint">
<security:intercept-url pattern="/saml/mysignin" access="IS_AUTHENTICATED_FULLY"/>
<security:custom-filter before="FIRST" ref="metadataGeneratorFilter"/>
<security:custom-filter after="BASIC_AUTH_FILTER" ref="samlFilter"/>
</security:http>
<bean id="samlFilter" class="org.springframework.security.web.FilterChainProxy">
<security:filter-chain-map request-matcher="ant">
<security:filter-chain pattern="/saml/login/**" filters="samlEntryPoint"/>
<security:filter-chain pattern="/saml/logout/**" filters="samlLogoutFilter"/>
<security:filter-chain pattern="/saml/metadata/**" filters="metadataDisplayFilter"/>
<security:filter-chain pattern="/saml/SSO/**" filters="samlWebSSOProcessingFilter"/>
<security:filter-chain pattern="/saml/SSOHoK/**" filters="samlWebSSOHoKProcessingFilter"/>
<security:filter-chain pattern="/saml/SingleLogout/**" filters="samlLogoutProcessingFilter"/>
<security:filter-chain pattern="/saml/discovery/**" filters="samlIDPDiscovery"/> …
Run Code Online (Sandbox Code Playgroud) 我正在使用spring-saml实现。在 WebSSOProfileConsumerImpl 类中,我可以找到以下几行代码,用于检查SAML 响应断言中的nameId 。
NameID nameID;
if (subject.getEncryptedID() != null) {
Assert.notNull(context.getLocalDecrypter(), "Can't decrypt NameID, no decrypter is set in the context");
nameID = (NameID) context.getLocalDecrypter().decrypt(subject.getEncryptedID());
} else {
nameID = subject.getNameID();
}
Run Code Online (Sandbox Code Playgroud)
根据代码,很明显 nameId 应该是主题的一部分。但是大多数 IDP 包括我使用的那个都提到 nameId 可能是subject/attribute 的一部分。似乎有一些实现像SimpleSAMLPHP一样接受主题中的nameId。
我收到的主题如下,没有包含 nameId
<saml2:Subject>
<saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml2:SubjectConfirmationData Address="91.X.X.X" InResponseTo="XXXX" NotOnOrAfter="2014-10-10T10:34:26.619Z" Recipient="http://localhost:8080/XXXX/saml/SSO"/>
</saml2:SubjectConfirmation>
</saml2:Subject>
Run Code Online (Sandbox Code Playgroud)
但是,有一个属性将nameId作为其属性值。为什么不能用这个代替主题中的那个。
<saml2:Attribute FriendlyName="testID" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
<saml2:AttributeValue> …
Run Code Online (Sandbox Code Playgroud)