“HTTP 状态 401 - 身份验证失败:传入 SAML 消息无效”,Salesforce 作为实施 SSO 的 IdP

2023-11-28

我已经使用 Spring SAML 实现了 SSO,一切正常。到目前为止,它已与以下 IDP 合作: 1) idp.ssocircle.com 2) openidp.feide.no

现在我正在使用 salesforce.com 作为我的身份提供商进行测试。由于没有上传服务提供商元数据的规定,我在其 IdP 上完成了以下配置设置:

提供了我的实体 ID 和断言消费者服务 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"/>

现在,当我尝试测试我的 SP 时,它首先将我重定向到 IDP(salesforce),询问我输入凭据的位置,但之后我被重定向回我的断言消费者服务 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
Registry could not locate evaluable criteria for criteria class org.opensaml.xml.security.keyinfo.KeyInfoCriteria
Attempting to validate signature using key from supplied credential
Creating XMLSignature object
Validating signature with signature algorithm URI: http://www.w3.org/2000/09/xmldsig#rsa-sha1
Validation credential key algorithm 'RSA', key instance class 'sun.security.rsa.RSAPublicKeyImpl'
Signature validated with key from supplied credential
Signature validation using candidate credential was successful
Successfully verified signature using KeyInfo-derived credential
Attempting to establish trust of KeyInfo-derived credential
Failed to validate untrusted credential against trusted key
Failed to establish trust of KeyInfo-derived credential
Failed to verify signature and/or establish trust using any KeyInfo-derived credentials
Attempting to verify signature using trusted credentials
Attempting to validate signature using key from supplied credential
Creating XMLSignature object
Validating signature with signature algorithm URI: http://www.w3.org/2000/09/xmldsig#rsa-sha1
Validation credential key algorithm 'RSA', key instance class 'sun.security.rsa.RSAPublicKeyImpl'
Signature did not validate against the credential's key
Signature validation using candidate validation credential failed
org.opensaml.xml.validation.ValidationException: Signature did not validate against the credential's key
at org.opensaml.xml.signature.SignatureValidator.validate(SignatureValidator.java:79)
at org.opensaml.xml.signature.impl.BaseSignatureTrustEngine.verifySignature(BaseSignatureTrustEngine.java:142)
at org.opensaml.xml.signature.impl.ExplicitKeySignatureTrustEngine.validate(ExplicitKeySignatureTrustEngine.java:110)
at org.opensaml.xml.signature.impl.ExplicitKeySignatureTrustEngine.validate(ExplicitKeySignatureTrustEngine.java:49)
at org.opensaml.ws.security.provider.BaseTrustEngineRule.evaluate(BaseTrustEngineRule.java:104)
at org.opensaml.ws.security.provider.BaseTrustEngineRule.evaluate(BaseTrustEngineRule.java:91)
at org.opensaml.common.binding.security.SAMLProtocolMessageXMLSignatureSecurityPolicyRule.doEvaluate(SAMLProtocolMessageXMLSignatureSecurityPolicyRule.java:128)
at org.opensaml.common.binding.security.SAMLProtocolMessageXMLSignatureSecurityPolicyRule.evaluate(SAMLProtocolMessageXMLSignatureSecurityPolicyRule.java:107)
at org.opensaml.ws.security.provider.BasicSecurityPolicy.evaluate(BasicSecurityPolicy.java:51)
at org.opensaml.ws.message.decoder.BaseMessageDecoder.processSecurityPolicy(BaseMessageDecoder.java:132)
at org.opensaml.ws.message.decoder.BaseMessageDecoder.decode(BaseMessageDecoder.java:83)
at org.opensaml.saml2.binding.decoding.BaseSAML2MessageDecoder.decode(BaseSAML2MessageDecoder.java:70)
at org.springframework.security.saml.processor.SAMLProcessorImpl.retrieveMessage(SAMLProcessorImpl.java:105)
at org.springframework.security.saml.processor.SAMLProcessorImpl.retrieveMessage(SAMLProcessorImpl.java:172)
at org.springframework.security.saml.SAMLProcessingFilter.attemptAuthentication(SAMLProcessingFilter.java:77)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:195)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:166)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:301)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:162)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:140)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Failed to verify signature using either KeyInfo-derived or directly trusted credentials
Validation of protocol message signature failed for context issuer 'https://ABC-dev-ed.my.salesforce.com', message type: {urn:oasis:names:tc:SAML:2.0:protocol}Response
Authentication request failed: org.springframework.security.authentication.AuthenticationServiceException: Incoming SAML message is invalid
Updated SecurityContextHolder to contain null Authentication
Delegating to authentication failure handler org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler@153a591

有人可以通过查看上面的日志告诉我出了什么问题吗?任何帮助将不胜感激。

Thanks,

Abhilash


您的 IDP 使用的数字签名密钥与元数据中定义的密钥不同。

您应该检查收到的 SAML 消息并在元素 Signature 中查找元素 X509Certificate。将证书的内容提取到单独的文件中,例如销售人员签名者

然后,您需要将证书导入到 samlKeystore.jks 中,您可以在中找到有关如何执行此操作的详细信息第4.5章(密钥管理)Spring SAML 手册。请务必记下导入密钥所用的别名。

最后一步,您需要告诉 Spring SAML 使用新导入的密钥对 IDP 进行签名验证,为此您应该更新 securityContext.xml 并使用属性signingKey 和您之前使用的别名的值更新 IDP 的 ExtendedMetadta导入密钥。它看起来类似于:

  <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:salesforce_metadata.xml</value>
              </constructor-arg>
              <property name="parserPool" ref="parserPool"/>
          </bean>
      </constructor-arg>
      <constructor-arg>
          <bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
              <property name="signingKey" value="sf-proxy"/>
          </bean>
      </constructor-arg>
  </bean>

同样,您可以在手册中找到所有这些的详细信息。

或者,您可以简单地将从消息中提取的密钥添加到 IDP 元数据中。只需手动更新 XML 文件并使用 use="signing" 添加另一个 KeyDescriptor 即可。这样做可能会更快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“HTTP 状态 401 - 身份验证失败:传入 SAML 消息无效”,Salesforce 作为实施 SSO 的 IdP 的相关文章

随机推荐

  • @Transient 在休眠状态下不工作

    我正在使用休眠4 1 9 我的代码是 Transient private String ldapIdTemp 包是 import javax persistence Transient 仍在休眠查询中 它不起作用并将属性放入查询中 查询片段
  • 我可以检测我的代码是否在 Azure 辅助角色中执行吗?

    我有一些在 Winforms 应用程序 Windows 服务和现在的 Azure 辅助角色中使用的共享程序集 项目 有什么方法可以在运行时检测我是否在 Azure 角色中运行 我发现如何检测是否正在运行 Azure 模拟器 Microsof
  • Flutter 项目和 Android X 迁移问题

    我刚刚创建了一个新的 flutter 项目 添加了一些插件 我将插件切换到 android x 因此我需要切换到 android x 我已经尝试了所有不同的迁移到 android x 的方法 但到目前为止没有一个对我有用 现在我什至不知道该
  • Laravel 5 分页 + 无限滚动 jQuery

    我正在尝试使用paginate 实现无限滚动 我认为最简单的方法是使用 无限滚动 来实现这一点 如果您有任何其他建议如何在没有无限滚动库的情况下仅使用 jQuery 做到这一点 我很高兴知道 我正在返回变量来查看 如下所示 public f
  • Flutter GetIt 插件 - GetIt 内未注册类型 xxx

    我按照示例项目中所示设置了所有内容 import package get it get it dart import package places services authService dart final locator GetIt
  • 禁止链接标题

    有什么方法可以抑制链接上的弹出标题 但仍将它们保留在页面上以供视障人士使用吗 这是浏览器解释链接标题并显示工具提示 弹出窗口的功能 没有办法压制他们 我尝试过 因为客户也不喜欢它们 并且没有办法绕过它们
  • 用于在客户端读取 doc 和 docx 的 JavaScript 库

    我正在寻找一个 JavaScript 库 它可以读取 doc and docx 文件 重点仅在于文本内容 我对 MS Word 文件中的图片 公式或其他特殊结构不感兴趣 如果该库能够与 JavaScript FileReader 一起使用
  • T* 与 char* 指针算术

    假设我们有一个包含 N 个 T 类型元素的数组 T a N 根据C 14标准 在什么条件下我们可以保证 char void a 0 n sizeof T char void a n 0 lt n
  • “react-native run-android” - 构建成功,但出现错误类型 3 错误:活动类 MainActivity 不存在

    我尝试在 Android 模拟器上运行应用程序 但失败了 我跑react native run android BUILD是成功的 但我收到错误类型 3 并且我没有看到它安装在模拟器上 当我在cmd中运行 react native run
  • 使用请求登录 WordPress - Python3

    import requests with requests Session as s headers1 Cookie wordpress test cookie WP Cookie check datas log admin pwd adm
  • 三个js对象的单位是什么?

    var camera new THREE PerspectiveCamera 35 Field of view 800 640 Aspect ratio 1 Near 10000 Far var cube new THREE Mesh ne
  • 如何使用 C# 查询 NTP 服务器?

    我需要的只是一种使用 C 查询 NTP 服务器的方法 以获取返回的 NTP 服务器的日期时间string或作为DateTime 这怎么可能以最简单的形式实现呢 由于旧的接受答案已被删除 这是一个不再存在的 Google 代码搜索结果的链接
  • SQLite 提交期间数据库文件被莫名锁定

    我正在对 SQLite 数据库执行大量插入 我只使用一根线程 我批量写入以提高性能 并在发生崩溃时具有一定的安全性 基本上 我在内存中缓存了一堆数据 然后当我认为合适时 我循环遍历所有这些数据并执行插入 其代码如下所示 public voi
  • 64 位 Windows 上的 P/Invoke 是否需要与 32 位 Windows 上不同的签名?

    当我创建一个引用的签名时user32 dll例如我应该用user64 dll如果目标是 64 位计算机 DllImport user32 dll CharSet CharSet Auto public static extern bool
  • Microsoft 图表控件和 X 轴时间刻度格式

    我的 winforms 应用程序中有一个 Microsoft 图表控件 我目前在循环中播放 X 和 y 值 我还将 X 轴格式设置为 ChartAreas 0 AxisX LabelStyle Format 00 00 00 这作为时间格式
  • 如果我忘记关闭扫描集会怎样?

    假设我忘记关闭右方括号 的扫描集 那会发生什么 它会调用未定义的行为吗 Example char str Hello One Two Three char s1 50 0 s2 50 0 sscanf str s h s1 s2 UB pr
  • List.view 和 LazyList 有什么区别?

    我是 Scala 新手 我刚刚了解到LazyList被创建来取代Stream 同时他们添加了 view所有集合的方法 所以 我想知道为什么LazyList添加到 Scala 集合库 当我们可以做的时候List view 我刚刚看了 Scal
  • 如何在Conv2D层中使用keras指定填充?

    我正在尝试实施AlexNet使用 Keras 并检查 MATLAB 中的网络设计 如下所示 可以看出 第二个卷积层有 256 个大小为 5x5 的滤波器 48 个通道和 2 2 2 2 的填充 我怎样才能指定padding与 Keras 的
  • PHP 构造函数内的全局变量

    这应该是显而易见的 但我对 PHP 变量范围有点困惑 我在构造函数中有一个变量 我想稍后在同一个类的函数中使用它 我目前的方法是这样的 有没有比滥用环境变量更好的方法来做到这一点 谢谢 您可以使用类变量 它具有 类的上下文 当然 以 PHP
  • “HTTP 状态 401 - 身份验证失败:传入 SAML 消息无效”,Salesforce 作为实施 SSO 的 IdP

    我已经使用 Spring SAML 实现了 SSO 一切正常 到目前为止 它已与以下 IDP 合作 1 idp ssocircle com 2 openidp feide no 现在我正在使用 salesforce com 作为我的身份提供