【问题标题】:Response doesn't have any valid assertion which would pass subject validation响应没有任何可以通过主题验证的有效断言
【发布时间】:2016-01-29 06:39:23
【问题描述】:

我对 SAML 和 ADFS 完全陌生。我尝试用谷歌搜索我的错误,但遗憾的是没有得到任何点击。我一直在尝试设置 Spring SAML 和 ADFS,这样我就可以通过关注 this guide 进行单点登录工作了没有任何可以通过主题验证的有效断言

轨迹:

[#|2015-10-29T08:03:43.334+0100|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=1689;_ThreadName=Thread-2;|- AuthNResponse;FAILURE;fe80:0:0:0:e1fd:739e:9d4e:8883%14;https://nkr-beh1:18181/saml/saml/metadata;http://NKR-AD.adm.kulturrad.no/adfs/services/trust;;;org.opensaml.common.SAMLException: Response doesn't have any valid assertion which would pass subject validation
at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.java:229)
at org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:82)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
at org.springframework.security.saml.SAMLProcessingFilter.attemptAuthentication(SAMLProcessingFilter.java:84)
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.saml.metadata.MetadataGeneratorFilter.doFilter(MetadataGeneratorFilter.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:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:745)

我检查了代码,它应该从响应 (ADFS) 中获取断言,如果它为 null,它会抛出错误。我想这意味着我的 ADFS 缺少某些东西,或者我误解了断言是什么?

【问题讨论】:

    标签: spring saml adfs


    【解决方案1】:

    我在 Srping 安全 SAML 中遇到了同样的问题,解决方案是当您创建 MetadataGenerator Bean 时,实体 ID 集应该与 Idp Provider 中的 Audience Restriction(或类似字段)完全匹配,我使用 Okta 作为 Idp Provider 因此 Audience限制是正确配置的字段

    【讨论】:

      【解决方案2】:

      首先,您应该进行 Fiddler 跟踪并查看 AD FS 是否成功发布了令牌。或者,您可以在 AD FS 端启用审核,以查看颁发了哪些令牌(如果有)。

      查看此处了解审核说明 https://technet.microsoft.com/en-us/library/adfs2-troubleshooting-configuring-computers(WS.10).aspx#bkmk_ConfigureAuditing

      然后安全事件日志和 AD FS 事件日志应该确认是否有错误颁发令牌或是否成功颁发。

      查看此处了解有关审查 Fiddler 的一些详细信息。它是为 wsfed 编写的,但也有助于 SAML。 http://social.technet.microsoft.com/wiki/contents/articles/3286.aspx

      这个插件也可以用来更好地查看令牌。可能比使用 textwizard 更容易进行 base64/deflatedsaml 解码(如果适用)。 http://social.technet.microsoft.com/wiki/contents/articles/3590.fiddler-inspector-for-federation-messages.aspx

      Fiddler 将干扰 Windows 集成身份验证,除非您点击此链接并禁用 AD FS 上的扩展保护。 http://social.technet.microsoft.com/wiki/contents/articles/ad-fs-2-0-continuously-prompted-for-credentials-while-using-fiddler-web-debugger.aspx

      如果你有 2012R2 你应该这样做

      Set-ADFSProperties -ExtendedProtectionTokenCheck None 
      

      如果您的应用提供了加密证书并且 AD FS 正在发送加密的断言,Fiddler 将无法提供帮助。在这种情况下,AD FS 安全日志和调试日志更易于使用来准确查看发送的内容。

      这里的目标是查看断言和主题元素。然后检查验证失败的原因。

      您可以在https://rnd.feide.no/samlexample/simplesamlphp_saml_2_0_authentication_response/ 看到一个示例断言。您需要查看 AD FS 是否成功发布了令牌(检查状态为成功而不是响应者)以及主题是否符合您的应用验证检查。

      【讨论】:

      • 感谢您的帮助,只是 Fiddler 工具将来会是一个很大的帮助。似乎问题是无效的凭据,不知道为什么,但我将不得不进一步研究。错误消息:<div id="content"> <div class="content-container"><fieldset> <h2>401 - Unauthorized: Access is denied due to invalid credentials.</h2> <h3>You do not have permission to view this directory or page using the credentials that you supplied.</h3> </fieldset></div> </div> 不知道为什么它会继续运行而没有给我重新验证的机会,但从技术上讲,这个问题现在已经得到解答。
      • 修改后的答案以包括针对身份验证问题的 Fiddler 指南。
      【解决方案3】:

      当我收到此错误时,我的日志还包含以下消息:

      Decryption of received assertion failed, assertion will be skipped
      

      在调试级别(来自 WebSSOProfileConsumerImpl 类),并且:

      Error decrypting the encrypted data element
      org.apache.xml.security.encryption.XMLEncryptionException: Illegal key size
      

      在错误级别。

      SAML 响应包含:

      <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
      

      请注意,256 位 AES 加密需要 JCE 无限强度 jar。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-16
        • 2021-02-04
        • 2022-01-01
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多