1

我一直在尝试在 java 中实现一个 WEB SSO 服务提供者。我正在使用 Shibboleth 身份提供程序。在身份验证步骤之前一切正常,我能够成功地为用户创建会话/设置 cookie。但是,当我尝试使用单点注销功能时,我收到了来自 shibboleth IdP 的“RequestDenied”响应。我检查了日志,上面写着入站消息发布者未通过身份验证。同一发行人在登录步骤中工作正常,但在注销步骤中出错。任何要为其更新的配置文件,任何指针,建议?这是我的注销请求。

<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                     ID="jiojjcjckjaflbedlcjcpcnecigbjhaekalmfkcg"
                     IssueInstant="2014-02-24T23:30:25.257Z"
                     NotOnOrAfter="2014-02-24T23:35:25.257Z"
                     Version="2.0"
                     >
    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://localhost/sp/shibboleth</saml:Issuer>
    <saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
                 Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"
                 NameQualifier="urn:oasis:names:tc:SAML:2.0:assertion"
                 >rohit</saml:NameID>
    <samlp:SessionIndex/>
</samlp:LogoutRequest>

这就是我得到的回应。

<saml2p:LogoutResponse xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
                       Destination="https://localhost:8091/SSO/consumer"
                       ID="_02a145f4992cb2e11a8fc4aa43a74096"
                       InResponseTo="jiojjcjckjaflbedlcjcpcnecigbjhaekalmfkcg"
                       IssueInstant="2014-02-24T23:30:25.334Z"
                       Version="2.0"
                       >
    <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
                  Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
                  >https://localhost/shibboleth</saml2:Issuer>
    <saml2p:Status>
        <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder">
            <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:RequestDenied" />
        </saml2p:StatusCode>
        <saml2p:StatusMessage>Message did not meet security requirements</saml2p:StatusMessage>
    </saml2p:Status>
</saml2p:LogoutResponse>
4

1 回答 1

3

您为 SLO 配置文件启用了名为强制消息身份验证的设置。

您通常可以在依赖方配置文件的底部找到设置。它应该看起来像这样。

<security:SecurityPolicy id="shibboleth.SAML2SLOSecurityPolicy" xsi:type="security:SecurityPolicyType">
    <security:Rule xsi:type="samlsec:Replay"/>
    <security:Rule xsi:type="samlsec:IssueInstant"/>
    <security:Rule xsi:type="samlsec:ProtocolWithXMLSignature" trustEngineRef="shibboleth.SignatureTrustEngine"/>
    <security:Rule xsi:type="samlsec:SAML2HTTPRedirectSimpleSign" trustEngineRef="shibboleth.SignatureTrustEngine"/>
    <security:Rule xsi:type="samlsec:SAML2HTTPPostSimpleSign" trustEngineRef="shibboleth.SignatureTrustEngine"/>
    <security:Rule xsi:type="security:ClientCertAuth" trustEngineRef="shibboleth.CredentialTrustEngine"/>
    <security:Rule xsi:type="samlsec:MandatoryIssuer"/>
    <security:Rule xsi:type="security:MandatoryMessageAuthentication"/>
</security:SecurityPolicy>

强制消息身份验证将要求您设置一种方法来验证消息来自受信任的对等方。通常这是通过签名请求完成的。SP 可以签署他们的元数据并公开证书以进行验证。Shibboleth 可以设置为信任来自 SP 的证书。

实现此目的的一种方法是在元数据提供程序中为您的 SP 设置一个元数据过滤器,如下所示:

<metadata:MetadataFilter xsi:type="metadata:SignatureValidation"
                         trustEngineRef="shibboleth.MetadataTrustEngine"
                         requireSignedMetadata="true" />

这引用了一个名为shibboleth.MetadataTrustEngine. 信任引擎可用于签名验证。

信任引擎也在依赖方配置中定义,因此只需查找它。默认设置如下所示:

<security:TrustEngine id="shibboleth.SignatureTrustEngine" xsi:type="security:SignatureChaining">
    <security:TrustEngine id="shibboleth.SignatureMetadataExplicitKeyTrustEngine" xsi:type="security:MetadataExplicitKeySignature" metadataProviderRef="ShibbolethMetadata"/>
    <security:TrustEngine id="shibboleth.SignatureMetadataPKIXTrustEngine" xsi:type="security:MetadataPKIXSignature" metadataProviderRef="ShibbolethMetadata"/>
</security:TrustEngine>

如果您已将元数据提供程序定义为默认链接元数据提供程序的一部分,这就足够了。

或者,您可以通过注释掉来关闭消息身份验证策略:

<security:Rule xsi:type="security:MandatoryMessageAuthentication"/>
于 2014-04-15T22:03:34.120 回答