【问题标题】:Spring SAML Access is denied after one minute一分钟后 Spring SAML 访问被拒绝
【发布时间】:2017-06-29 23:00:52
【问题描述】:

我已经在 web 应用程序中实现了 SAML2 身份验证。 一开始一切正常。用户登录并可以使用应用程序,但一分钟后他得到 401 并重新加载整个页面。

可能是什么原因?它连接到 SAML 票 NotOnOrAfter 属性? 如何解决此问题并禁用此重新加载和重新身份验证?

在日志中我可以看到:

7:13:55.271 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] o.s.s.w.a.i.FilterSecurityInterceptor :安全对象: 过滤器调用:URL:/sw.js;属性:【已认证】2017-02-11 17:13:55.271 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] o.s.s.w.a.i.FilterSecurityInterceptor :以前经过身份验证: org.springframework.security.authentication.AnonymousAuthenticationToken@9055e4a6: 委托人:anonymousUser;凭证:[受保护];已验证: 真;详情: org.springframework.security.web.authentication.WebAuthenticationDetails@957e: 远程IP地址:127.0.0.1;会话 ID: 3A25B5C297F7BCF47C70ACA09D03EEC6;授予权限:ROLE_ANONYMOUS 2017-02-11 17:13:55.271 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] os.s.access.vote.AffirmativeBased
: 选民: org.springframework.security.web.access.expression.WebExpressionVoter@4e54fa5d, 返回:-1 2017-02-11 17:13:55.271 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] o.s.s.w.a.ExceptionTranslationFilter : 访问被拒绝(用户是匿名的);重定向到身份验证 入口点

org.springframework.security.access.AccessDeniedException: 访问是 拒绝 org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:84) 在 org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:233) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:124) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.saml.SAMLLogoutProcessingFilter.processLogout(SAMLLogoutProcessingFilter.java:206) 在 org.springframework.security.saml.SAMLLogoutProcessingFilter.doFilter(SAMLLogoutProcessingFilter.java:104)

2017-02-11 17:13:55.291 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] os.s.w.s.HttpSessionRequestCache
: DefaultSavedRequest 添加到 Session: DefaultSavedRequest[https://somesite/saml/SSO/sw.js]2017-02-11 17:13:55.291 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] os.s.w.a.ExceptionTranslationFilter : 调用身份验证 入口点。 2017-02-11 17:13:55.306 DEBUG 29368 --- [http-nio-127.0.0.1-5814-exec-7] o.s.s.s.context.SAMLContextProviderImpl : 未指定 IDP,使用 默认 MINEIDP 2017-02-11 17:13:55.307 DEBUG 29368 --- [http-nio-127.0.0.1-5814-exec-7] os.security.saml.util.SAMLUtil
: 未指定 AssertionConsumerService 的索引,返回默认值 2017-02-11 17:13:55.308 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] o.s.security.saml.SAMLEntryPoint
: 使用 WebSSO 配置文件处理 SSO 2017-02-11 17:13:55.308 DEBUG 29368 --- [http-nio-127.0.0.1-5814-exec-7] os.s.saml.websso.WebSSOProfileImpl : 使用默认消费者 绑定 urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST 的服务 2017-02-11 17:13:55.308 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] os.security.saml.util.SLF4JLogChute : ResourceManager : 找到 /templates/saml2-post-binding.vm 和加载器 org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader 2017-02-11 17:13:55.308 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] os.security.saml.util.SLF4JLogChute :资源管理器:找到 /templates/add-html-head-content.vm 与 装载机 org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader 2017-02-11 17:13:55.308 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] os.security.saml.util.SLF4JLogChute :ResourceManager:找到/templates/add-html-body-content.vm 装载机 org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader 2017-02-11 17:13:55.308 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] o.s.s.w.header.writers.HstsHeaderWriter :不注入 HSTS 标头 因为它与 requestMatcher 不匹配 org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@66d6b7bc 2017-02-11 17:13:55.308 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] w.c.HttpSessionSecurityContextRepository : SecurityContext 为空或 内容是匿名的 - 上下文不会存储在 HttpSession 中。 2017-02-11 17:13:55.308 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] os.s.saml.storage.HttpSessionStorage : 将消息 a2h65aag15ccg2d837386cch748e34h 存储到会话 3A25B5C297F7BCF47C70ACA09D03EEC6 2017-02-11 17:13:55.308 信息 29368 --- [http-nio-127.0.0.1-5814-exec-7] os.security.saml.log.SAMLDefaultLogger : AuthNRequest;SUCCESS;127.0.0.1;https://somesite.. 2017-02-11 17:13:55.308 调试 29368 --- [http-nio-127.0.0.1-5814-exec-7] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder 现在 清除,因为请求处理完成 2017-02-11 17:13:55.308 DEBUG 29368 --- [http-nio-127.0.0.1-5814-exec-7] o.s.b.w.f.OrderedRequestContextFilter : 清除线程绑定 请求上下文:org.apache.catalina.connector.RequestFacade@7bfe8944 2017-02-11 17:13:56.527 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] o.s.b.w.f.OrderedRequestContextFilter :将请求上下文绑定到线程: org.apache.catalina.connector.RequestFacade@7bfe8944 2017-02-11 17:13:56.527 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] os.security.web.FilterChainProxy : /saml/SSO 在位置 1 16 个附加过滤器链;发射过滤器: 'WebAsyncManagerIntegrationFilter' 2017-02-11 17:13:56.527 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] o.s.security.web.FilterChainProxy : /saml/SSO 位于附加过滤器链中第 16 位的第 2 位;射击 过滤器:'SecurityContextPersistenceFilter' 2017-02-11 17:13:56.527 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] w.c.HttpSessionSecurityContextRepository : HttpSession 返回 null SPRING_SECURITY_CONTEXT 的对象 2017-02-11 17:13:56.527 DEBUG 29368 --- [http-nio-127.0.0.1-5814-exec-3] w.c.HttpSessionSecurityContextRepository:没有SecurityContext 可从 HttpSession 获得: org.apache.catalina.session.StandardSessionFacade@491a27d7。一个新的 将被创建。 2017-02-11 17:13:56.527 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] os.security.web.FilterChainProxy
: /saml/SSO 位于附加过滤器链中第 16 位的第 3 位;射击 过滤器:'HeaderWriterFilter' 2017-02-11 17:13:56.527 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] os.security.web.FilterChainProxy
: /saml/SSO 位于附加过滤器链中第 16 位的第 4 位;射击 过滤器:'SAMLLogoutFilter' 2017-02-11 17:13:56.527 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] os.security.web.FilterChainProxy
: /saml/SSO 位于附加过滤器链中第 16 位的第 5 位;射击 过滤器:'MetadataGeneratorFilter' 2017-02-11 17:13:56.527 DEBUG 29368 --- [http-nio-127.0.0.1-5814-exec-3] o.s.security.web.FilterChainProxy : /saml/SSO 位于附加过滤器链中 16 位的第 6 位;射击 过滤器:'MetadataDisplayFilter' 2017-02-11 17:13:56.542 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] o.s.security.web.FilterChainProxy : /saml/SSO 位于附加过滤器链中 16 位的第 7 位;射击 过滤器:'XhrSamlEntryPoint' 2017-02-11 17:13:56.542 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] os.security.web.FilterChainProxy
: /saml/SSO 位于附加过滤器链中第 16 位的第 8 位;射击 过滤器:'SAMLProcessingFilter' 2017-02-11 17:13:56.542 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] o.s.security.saml.SAMLProcessingFilter : 请求处理 身份验证 2017-02-11 17:13:56.542 DEBUG 29368 --- [http-nio-127.0.0.1-5814-exec-3] o.s.security.saml.SAMLProcessingFilter : 尝试 SAML2 使用配置文件进行身份验证 urn:oasis:names:tc:SAML:2.0:profiles:SSO:browser 2017-02-11 17:13:56.542 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] o.s.s.saml.processor.SAMLProcessorImpl : 检索消息使用 绑定 urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST 2017-02-11 17:13:56.558 信息 29368 --- [http-nio-127.0.0.1-5814-exec-3] colMessageXMLSignatureSecurityPolicyRule :SAML 协议消息是 未签名,跳过 XML 签名处理 2017-02-11 17:13:56.558 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] os.security.saml.util.SAMLUtil:找到端点 org.opensaml.saml2.metadata.impl.AssertionConsumerServiceImpl@5e73661d 基于位置属性的请求 URL https://somesite/saml/SSO 在元数据 2017-02-11 17:13:56.558 调试 29368 --- [http-nio-127.0.0.1-5814-exec-3] os.s.authentication.ProviderManager : 身份验证尝试使用 org.springframework.security.saml.SAMLAuthenticationProvider 2017-02-11 17:13:56.558 信息 29368 --- [http-nio-127.0.0.1-5814-exec-3] c.p.k.s.CustomWebSSOProfileConsumerImpl :签名验证 省略。 2017-02-11 17:13:56.558 信息 29368 --- [http-nio-127.0.0.1-5814-exec-3] os.security.saml.log.SAMLDefaultLogger : AuthNResponse;SUCCESS;127.0.0.1;https://somesite;;

【问题讨论】:

    标签: spring-boot spring-security saml-2.0


    【解决方案1】:

    this 给我指路了。原因是在 saml 令牌中有 'NotOnOrAfter' 属性。在“SAMLAuthenticationProvider”方法中,“authenticate”正在创建“ExpiringUsernameAuthenticationToken”,其有效性基于“NotOnOrAfter”。我所做的是重写 'getExpirationDate' 方法并将令牌有效期延长到预期时间。

    【讨论】:

    • 执行此操作的 SAML 方法是在断言到期之前发送“被动 AuthnRequest”。如果用户仍然与 IdP 有会话,则 IdP 将发出新的断言。如果没有与 IdP 的会话,则应返回 SAML 错误,以便 SP 可以发送常规 AuthnRequest,这将导致 IdP 进行身份验证。
    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 2020-12-19
    • 2020-04-26
    • 2014-09-25
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2019-06-06
    相关资源
    最近更新 更多