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

Spring SAML别名用于实体和SP

狄卓君
2023-03-14

我是SAML的新手,正在将其集成到Spring Web应用程序中。我从这里找到的Spring SAML快速入门指南开始:http://docs.spring.io/spring-security-saml/docs/1.0.0.RELEASE/reference/html/chapter-quick-start.html

我的跑步成绩很好。然后我想切换到目标IDP,它已经在运行并成功地为公司内的其他SP服务。

在我的html" target="_blank">安全上下文中。xml,我在元数据bean中添加了以下内容:

    <bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
        <constructor-arg>
            <bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider">
                <constructor-arg>
                    <value type="java.io.File">classpath:security/MyEntityId_sp.xml</value>
                </constructor-arg>
                <property name="parserPool" ref="parserPool"/>
            </bean>
        </constructor-arg>
        <constructor-arg>
            <bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
               <property name="local" value="true"/>
               <property name="alias" value="myAlias"/>
               <property name="securityProfile" value="metaiop"/>
               <property name="sslSecurityProfile" value="pkix"/>
               <property name="signingKey" value="apollo"/>
               <property name="encryptionKey" value="apollo"/>
               <property name="requireArtifactResolveSigned" value="false"/>
               <property name="requireLogoutRequestSigned" value="false"/>
               <property name="requireLogoutResponseSigned" value="false"/>
               <property name="idpDiscoveryEnabled" value="false"/>
            </bean>
        </constructor-arg>
    </bean>

    <bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider">
        <constructor-arg>
            <value type="java.io.File">classpath:security/IDP-MetaData.xml</value>
        </constructor-arg>
        <property name="parserPool" ref="parserPool"/>
    </bean>

使用 Firefox SAML 跟踪器,我可以看到交互工作正常,并且 IDP 在使用有效的 SAML XML 数据包对用户进行身份验证后重定向回我的应用程序(SP)。这并不奇怪,因为此 IDP 已被其他 SP 成功使用。但是,它重定向到“http://localhost:8080/saml-demo/saml/SSO/alias/myAlias”,这反过来又会向浏览器抛出以下错误......

 Authentication request failed: org.springframework.security.authentication.AuthenticationServiceException: Error determining metadata contracts

使用Java调试器进一步深入研究代码,我发现真正的错误在代码中更深层。它由org.springframework.security.saml.metadata抛出。当MetadataManager在第913行看到SP和IDP的相同别名时。真正的错误是:

 MetadataProviderException: Alias myAlias is used both for entity MyEntityId and MyEntityId

除了《快速入门指南》之外,唯一的其他变化是对metadataGeneratorFilter:

<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
    <constructor-arg>
        <bean class="org.springframework.security.saml.metadata.MetadataGenerator">
            <property name="entityId" value="MyEntityId"/>
            <property name="signMetadata" value="false"/>
        </bean>
    </constructor-arg>
</bean> 

IDP 元数据文件包含 ...

<md:EntityDescriptor entityID="MyEntityId" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata">
  <md:IDPSSODescriptor WantAuthnRequestsSigned="0" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:KeyDescriptor use="signing">
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>xxxxxx</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:ArtifactResolutionService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://auth.myidp.com/sa1234/" index="0" isDefault="1" />
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://auth.myidp.com/sa1234/" />
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://auth.myidp.com/sa1234/" />
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://auth.myidp.com/sa1234/" />
    <md:ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://auth.myidp.com/sa1234/" />
    <md:ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://auth.myidp.com/sa1234/" />
    <md:ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://auth.myidp.com/sa1234/" />
    <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://auth.myidp.com/sa1234/" />
    <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://auth.myidp.com/sa1234/" />
    <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://auth.myidp.com/sa1234/" />
  </md:IDPSSODescriptor>
  <md:AttributeAuthorityDescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:KeyDescriptor use="signing">
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>xxxxxx</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:AttributeService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://auth.myidp.com/sa1234/" />
  </md:AttributeAuthorityDescriptor>
</md:EntityDescriptor>

以下是MyEntityId_sp.xml的内容:

<?xml version="1.0" encoding="UTF-8"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
    ID="MyEntityId" entityID="MyEntityId">
    <md:SPSSODescriptor AuthnRequestsSigned="true"
        WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
        <md:KeyDescriptor use="signing">
            <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:X509Data>
                    <ds:X509Certificate>xxx</ds:X509Certificate>
                </ds:X509Data>
            </ds:KeyInfo>
        </md:KeyDescriptor>
        <md:KeyDescriptor use="encryption">
            <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:X509Data>
                    <ds:X509Certificate>xxx</ds:X509Certificate>
                </ds:X509Data>
            </ds:KeyInfo>
        </md:KeyDescriptor>
        <md:SingleLogoutService
            Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
            Location="http://localhost:8080/saml-demo/saml/SingleLogout/alias/myAlias" />
        <md:SingleLogoutService
            Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
            Location="http://localhost:8080/saml-demo/saml/SingleLogout/alias/myAlias" />
        <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
        </md:NameIDFormat>
        <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient
        </md:NameIDFormat>
        <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
        </md:NameIDFormat>
        <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
        </md:NameIDFormat>
        <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName
        </md:NameIDFormat>
        <md:AssertionConsumerService
            Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"
            Location="http://localhost:8080/saml-demo/saml/SSO/alias/myAlias"
            index="0" isDefault="true" />
        <md:AssertionConsumerService
            Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://localhost:8080/saml-demo/saml/SSO/alias/myAlias"
            index="1" />
    </md:SPSSODescriptor>
</md:EntityDescriptor>

共有1个答案

商天逸
2023-03-14

我找到了问题所在。

IDP有一个访问群体限制,该限制使用了与IDP本身的EntityID相同的ID。我可以在IDP元数据文件中看到这一点:

<md:EntityDescriptor entityID="MyEntityId" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata">

然后使用Firefox SAML跟踪插件,我可以看到来自IDP的最终响应,其中包含:

<saml:AudienceRestriction> <saml:Audience>MyEntityId</saml:Audience> </saml:AudienceRestriction>

显然,“MyEntityID”不是字面上使用的,它是这个应用程序的关键字,在文件的上下文中是有意义的。然而,这意味着我需要给我的SP实体提供与这个观众限制相同的ID,否则我会得到一个错误。然而,正如Andrew K.指出的,你不能给两个实体相同的实体ID。

我不是设置IDP服务器的人,所以我无法控制其中的一些(IDP元数据文件是提供给我的,所以我只是假设它没有任何问题)。然而,为了解决这个问题,我只是简单地更改了IDP元数据文件中的entityID。我是SAML新手,但我不认为这会对我的具体实现有任何负面影响。

 类似资料:
  • 我正在尝试使用这个简短的实体识别教程来学习NER。但我无法成功运行代码。我在现场提供了一个入口。这里提到的txt文件。 我收到错误。 请帮帮我。先谢谢你。

  • 我有一个使用spring security和mvc框架开发的门户应用程序。此门户应用程序连接到IDP(使用Spring security和Spring saml开发)进行身份验证。如果用户身份验证成功,用户将被导航到主页,其中为外部应用程序提供了多个链接……当用户单击应用程序链接时,用户应成功导航到相应的应用程序,而无需质疑登录页面。 其他应用程序是使用strut和Spring Security开

  • 我正在编写一些代码来执行命名实体识别(NER),这对于英文文本来说非常好。然而,我希望能够将NER应用于任何语言。为此,我想1)识别文本的语言,然后2)将NER应用于识别的语言。对于第2步,我怀疑A)将文本翻译成英语,然后应用NER(英语),或B)将NER应用于所识别的语言。 以下是我目前掌握的代码。我想让NER在这种语言首次被识别后,为text2或任何其他语言工作: 有人有这方面的经验吗?非常感

  • 问题内容: 我正在寻找Java的简单但“足够好”的命名实体识别库(和字典),我正在处理电子邮件和文档并提取一些“基本信息”,例如:名称,地点,地址和日期 我一直在环顾四周,大多数似乎都是沉重的一面和完整的NLP项目。 有什么建议吗? 问题答案: 顺便说一句,我最近遇到了OpenCalais,它似乎具有我要照顾的功能。

  • 我是openNlp的新手。我开始训练一个模型(TokenNameFinderTrainer),以识别名称。到目前为止还不错,但现在我想识别组织(例如“Microsoft”)。 我的问题是:opennlp默认识别哪些类型的实体?(如果有的话...) 我看到它可以处理

  • 问题内容: 当我使用@Entity注释类并尝试解析依赖项时,我可以在两个不同的包javax.persistence.Entity和org.hibernate.annotations.Entity中选择包。 javax包是JPA的实体注释,但是为什么会有hibernate的实体注释,它与JPA的注释有区别?仅仅是允许定义更多属性的扩展吗? 问题答案: 具有一些尚未标准化的额外属性。仅当直接使用hib