Shinyproxy: SAML 인증 μ‹œκ°„ 초과(?) 였λ₯˜

에 λ§Œλ“  2021λ…„ 02μ›” 15일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: openanalytics/shinyproxy

λ‹€μ‹œ μ•ˆλ…•! SAML을 μ‚¬μš©ν•˜μ—¬ μ•± κ°œλ°œμ„ μ§„ν–‰ν•˜λ©΄μ„œ 탭이 일정 μ‹œκ°„ λ™μ•ˆ μ—΄λ € μžˆλŠ” κ²½μš°μ—λ§Œ λ°œμƒν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μ΄λŠ” 인증 문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€(문제λ₯Ό μΌμœΌν‚€λŠ” μ •ν™•ν•œ μ‹œκ°„ λ²”μœ„λ₯Ό νŒŒμ•…ν•˜μ§€ λͺ»ν•¨). 그런 λ‹€μŒ μ‚¬μš©μžλŠ” 탭을 μƒˆλ‘œ κ³ μΉ©λ‹ˆλ‹€(이 μ‹œμ μ—μ„œ μƒˆ 창이 νŠΈλ¦¬κ±°ν•˜λŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŒ). 이 λΉ„ν™œμ„± μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ ShinyProxyκ°€ μž¬μΈμ¦μ„ μ‹œλ„ν•˜κ³  μ–΄λ–€ 이유둜 μ‹€νŒ¨ν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. λ‚΄κ°€ 찾은 μœ μΌν•œ 해결책은 IdP(auth.company.com)에 λŒ€ν•œ λΈŒλΌμš°μ €μ—μ„œ μ‚¬μ΄νŠΈ 데이터λ₯Ό μ§€μš°λŠ” κ²ƒμž…λ‹ˆλ‹€. μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

이 경우 ShinyProxyλŠ” μ—°μ†μœΌλ‘œ μ—¬λŸ¬ 번 인증을 μ‹œλ„ν•˜μ§€λ§Œ(URL ν‘œμ‹œμ€„μ—μ„œ λ§Žμ€ SAML λ¦¬λ””λ ‰μ…˜ μ½œλ°±μ„ λ³Ό 수 있음) κ²°κ΅­ μ‹€νŒ¨ν•˜κ³  http://my.company.com/app/saml에 λ€ν”„ν•©λ‹ˆλ‹€

image

μ„œλ²„ λ‘œκ·Έμ— λ‹€μŒμ΄ ν‘œμ‹œλ©λ‹ˆλ‹€.

shinyproxy-server_1  | 2021-02-15 04:00:11.531  INFO 1 --- [  XNIO-1 task-4] o.s.security.saml.log.SAMLDefaultLogger  : AuthNRequest;SUCCESS;XXX.XX.XX.XXX;https://my.company.com/app;http://auth.company.com/adfs/services/trust;;;
shinyproxy-server_1  | 2021-02-15 04:00:11.608  INFO 1 --- [  XNIO-1 task-4] colMessageXMLSignatureSecurityPolicyRule : Validation of protocol message signature succeeded, message type: {urn:oasis:names:tc:SAML:2.0:protocol}Response
shinyproxy-server_1  | 2021-02-15 04:00:11.609  INFO 1 --- [  XNIO-1 task-4] o.s.security.saml.log.SAMLDefaultLogger  : AuthNResponse;FAILURE;XXX.XX.XX.XXX;https://my.company.com/app;http://auth.company.com/adfs/services/trust;;;org.springframework.security.saml.SAMLStatusException: Response has invalid status code urn:oasis:names:tc:SAML:2.0:status:Responder, status message is null

λ­”κ°€ μ΄μƒν•œ 것은 첫 번째 인증 μ‹œλ„κ°€ μ„±κ³΅ν•œ κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ ShinyProxyκ°€ μ–΄λ–€ 이유둜 그것을 μ’‹μ•„ν•˜μ§€ μ•Šκ³  λ‹€μ‹œ μ‹œλ„ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.


전체 였λ₯˜ 역좔적:

~Shinyproxy-server_1 |
org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:88)μ—μ„œShinyproxy-server_1 |
org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:219)Shinyproxy-server_1 |
sun.reflect.GeneratedMethodAccessor63.invokeμ—μ„œ(μ•Œ 수 μ—†λŠ” μ†ŒμŠ€)Shinyproxy-server_1 |
java.lang.reflect.Method.invoke(Method.java:498)μ—μ„œShinyproxy-server_1 |
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205)Shinyproxy-server_1 |
org.springframework.security.saml.SAMLProcessingFilter.attemptAuthentication(SAMLProcessingFilter.java:92)Shinyproxy-server_1 |
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)Shinyproxy-server_1 |
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186)Shinyproxy-server_1 |
org.springframework.security.web.authenticationμ—μ„œ.
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)Shinyproxy-server_1 |
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)Shinyproxy-server_1 |
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)Shinyproxy-server_1 |
org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:117)Shinyproxy-server_1 |
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)Shinyproxy-server_1 |
org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77)Shinyproxy-server_1 |
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)Shinyproxy-server_1 |
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)Shinyproxy-server_1 |
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)Shinyproxy-server_1 |
org.springframework.security.saml.metadata.MetadataGeneratorFilter.doFilter(MetadataGeneratorFilter.java:87)Shinyproxy-server_1 |
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)Shinyproxy-server_1 |
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)Shinyproxy-server_1 |
io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)Shinyproxy-server_1 |
org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)Shinyproxy-server_1 |
io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)Shinyproxy-server_1 |
org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93)Shinyproxy-server_1 |
io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)Shinyproxy-server_1 |
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)Shinyproxy-server_1 |
io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)Shinyproxy-server_1 |
io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)Shinyproxy-server_1 |
io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)Shinyproxy-server_1 |
io.undertow.server.handlers.PathHandler.handleRequest(PathHandler.java:91)Shinyproxy-server_1 |
io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)Shinyproxy-server_1 |
io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)Shinyproxy-server_1 |
io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)Shinyproxy-server_1 |
io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)Shinyproxy-server_1 |
io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)Shinyproxy-server_1 |
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)Shinyproxy-server_1 |
io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)Shinyproxy-server_1 |
io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)Shinyproxy-server_1 |
io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)Shinyproxy-server_1 |
io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)Shinyproxy-server_1 |
io.undertow.server.Connectors.executeRootHandler(Connectors.java:370)Shinyproxy-server_1 |
org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)μ—μ„œShinyproxy-server_1 |
org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)Shinyproxy-server_1 |
java.lang.Thread.run(Thread.java:748)μ—μ„œ~

κ°„λ‹¨ν•œ 해결책은 "λ‘œκ·Έμ•„μ›ƒ" λ²„νŠΌμ„ ν΄λ¦­ν•˜λŠ” κ²ƒμ΄μ§€λ§Œ ν•΄λ‹Ή λ²„νŠΌμ€ SAML 였λ₯˜ 화면에 ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μš”μ²­ μ‹œ λ°œμƒν•˜λ„λ‘ ν•  수 μ—†κΈ° λ•Œλ¬Έμ— λ””λ²„κ·Έν•˜κΈ°κ°€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€. λ‚΄ IdP 지원 λ‹΄λ‹Ήμžμ— λ”°λ₯΄λ©΄ ADFSλŠ” μ‹€μ œλ‘œ 이 ν”„λ‘œμ„ΈμŠ€κ°€ μ‹œμž‘λ  λ•Œ μœ νš¨ν•œ 토큰을 λ°œκΈ‰ν•˜λ―€λ‘œ ShinyProxyκ°€ μˆ˜μ‹ ν•˜λŠ” 토큰을 μ²˜λ¦¬ν•˜λŠ” 방식에 둜컬 문제인 것 κ°™μŠ΅λ‹ˆλ‹€. λΈŒλΌμš°μ € 탭이 λ‹«νžˆμ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ•„λ§ˆλ„ 둜그인 μΏ ν‚€κ°€ λ§Œλ£Œλ˜μ–΄ μ˜¬λ°”λ₯΄κ²Œ κ°±μ‹ λ˜μ§€ μ•Šμ•˜μ„ κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ œκ°€ 무슨 말을 ν•˜λŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

였λ₯˜κ°€ λ‹€μ‹œ λ°œμƒν•˜λ©΄ μ’€ 더 μœ μš©ν•œ 정보λ₯Ό 가지고 λŒμ•„μ˜¬ κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ λˆ„κ΅°κ°€ 이것을 보고 μˆ˜μ •ν•˜λŠ” 방법에 λŒ€ν•œ 아이디어가 μžˆλŠ”μ§€ κΆκΈˆν–ˆμŠ΅λ‹ˆλ‹€.

question

λͺ¨λ“  6 λŒ“κΈ€

SHA-1κ³Ό SHA-256 μ„œλͺ… μ•Œκ³ λ¦¬μ¦˜ μ‚¬μ΄μ˜ 뢈일치λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μœ μ‚¬ν•œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό κ°€λ¦¬ν‚€λŠ” λ‹€μŒ 문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 였랜 κΈ°κ°„ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ κ°„ν—μ μœΌλ‘œ μ‹€νŒ¨ν•˜λ―€λ‘œ 이것이 λ‚΄ 문제라고 μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

후속 쑰치둜 μ•±μ˜ SAML 뢀뢄을 DEBUG μˆ˜μ€€ λ‘œκΉ…μœΌλ‘œ μ„€μ •ν–ˆμœΌλ©° μ΄λŸ¬ν•œ μ‹œκ°„ 초과 이벀트 쀑 ν•˜λ‚˜μ—μ„œ λ‹€μŒμ„ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

shinyproxy-server_1  | 2021-02-15 21:03:14.050 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.s.context.SAMLContextProviderImpl  : No IDP specified, using default http://auth.company.com/adfs/services/trust
shinyproxy-server_1  | 2021-02-15 21:03:14.050 DEBUG 1 --- [  XNIO-1 task-2] o.s.security.saml.util.SAMLUtil          : Index for AssertionConsumerService not specified, returning default
shinyproxy-server_1  | 2021-02-15 21:03:14.051 DEBUG 1 --- [  XNIO-1 task-2] o.s.security.saml.SAMLEntryPoint         : Processing SSO using WebSSO profile
shinyproxy-server_1  | 2021-02-15 21:03:14.051 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.saml.websso.WebSSOProfileImpl      : Using default consumer service with binding urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST
shinyproxy-server_1  | 2021-02-15 21:03:14.052 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.saml.storage.HttpSessionStorage    : Storing message a17g5ahbxxxxxxxxxxx454jj to session hxxxxxxJ_E8xxxxxxxxHP_TwIxxxxxxxH
shinyproxy-server_1  | 2021-02-15 21:03:14.053  INFO 1 --- [  XNIO-1 task-2] o.s.security.saml.log.SAMLDefaultLogger  : AuthNRequest;SUCCESS;XXX.XX.XXX.XX;https://my.company.com/app;http://auth.company.com/adfs/services/trust;;;
shinyproxy-server_1  | 2021-02-15 21:03:14.805 DEBUG 1 --- [  XNIO-1 task-2] o.s.security.saml.SAMLProcessingFilter   : Request is to process authentication
shinyproxy-server_1  | 2021-02-15 21:03:14.806 DEBUG 1 --- [  XNIO-1 task-2] o.s.security.saml.SAMLProcessingFilter   : Attempting SAML2 authentication using profile urn:oasis:names:tc:SAML:2.0:profiles:SSO:browser
shinyproxy-server_1  | 2021-02-15 21:03:14.811 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.saml.processor.SAMLProcessorImpl   : Retrieving message using binding urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST
shinyproxy-server_1  | 2021-02-15 21:03:14.816  INFO 1 --- [  XNIO-1 task-2] colMessageXMLSignatureSecurityPolicyRule : SAML protocol message was not signed, skipping XML signature processing
shinyproxy-server_1  | 2021-02-15 21:03:14.816 DEBUG 1 --- [  XNIO-1 task-2] o.s.security.saml.util.SAMLUtil          : Found endpoint org.opensaml.saml2.metadata.impl.AssertionConsumerServiceImpl<strong i="7">@6531c789</strong> for request URL https://my.company.com/app/saml/SSO based on location attribute in metadata
shinyproxy-server_1  | 2021-02-15 21:03:14.816 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.saml.storage.HttpSessionStorage    : Message a17g5ahb0gieeh9b4e48ff6a3d454jj found in session hXmYJ_E8wf6F2plFsHP_TwIZS1Cg6n2Vu4wD4i2H, clearing
shinyproxy-server_1  | 2021-02-15 21:03:14.817 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.s.w.WebSSOProfileConsumerImpl      : Verifying issuer of the Response
shinyproxy-server_1  | 2021-02-15 21:03:14.817 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.s.w.WebSSOProfileConsumerImpl      : Verifying signature
shinyproxy-server_1  | 2021-02-15 21:03:14.820 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.s.t.MetadataCredentialResolver     : Added 1 credentials resolved from metadata of entity http://auth.company.com/adfs/services/trust
shinyproxy-server_1  | 2021-02-15 21:03:14.826 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.s.w.WebSSOProfileConsumerImpl      : Processing Bearer subject confirmation
shinyproxy-server_1  | 2021-02-15 21:03:14.836 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.s.w.WebSSOProfileConsumerImpl      : Validation of authentication statement in assertion failed, skipping
shinyproxy-server_1  | org.springframework.security.authentication.CredentialsExpiredException: Authentication statement is too old to be used with value 2021-02-15T15:51:35.161Z
                        ...
shinyproxy-server_1  | 2021-02-15 21:03:14.839 DEBUG 1 --- [  XNIO-1 task-2] o.s.s.saml.SAMLAuthenticationProvider    : Error validating SAML message
shinyproxy-server_1  |
shinyproxy-server_1  | org.opensaml.common.SAMLException: Response doesn't have any valid assertion which would pass subject validation
                       ...
shinyproxy-server_1  |
shinyproxy-server_1  | 2021-02-15 21:03:14.841  INFO 1 --- [  XNIO-1 task-2] o.s.security.saml.log.SAMLDefaultLogger  : AuthNResponse;FAILURE;XXX.XX.XXX.XX;https://my.company.com/app;http://auth.company.com/adfs/services/trust;;;org.opensaml.common.SAMLException: Response doesn't have any valid assertion which would pass subject validation
shinyproxy-server_1  |  at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.java:265)
                       ...
shinyproxy-server_1  |
shinyproxy-server_1  | 2021-02-15 21:03:14.842  INFO 1 --- [  XNIO-1 task-2] e.o.containerproxy.service.UserService   : Authentication failure [user: ] [error: Error validating SAML message]
shinyproxy-server_1  | 2021-02-15 21:03:14.848 DEBUG 1 --- [  XNIO-1 task-2] o.s.security.saml.SAMLProcessingFilter   : Authentication request failed: org.springframework.security.authentication.AuthenticationServiceException: Error validating SAML message
shinyproxy-server_1  |
shinyproxy-server_1  | org.springframework.security.authentication.AuthenticationServiceException: Error validating SAML message
                       ...
shinyproxy-server_1  |
shinyproxy-server_1  | 2021-02-15 21:03:14.849 DEBUG 1 --- [  XNIO-1 task-2] o.s.security.saml.SAMLProcessingFilter   : Updated SecurityContextHolder to contain null Authentication
shinyproxy-server_1  | 2021-02-15 21:03:14.849 DEBUG 1 --- [  XNIO-1 task-2] o.s.security.saml.SAMLProcessingFilter   : Delegating to authentication failure handler org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler<strong i="8">@19dec0b4</strong>
shinyproxy-server_1  | 2021-02-15 21:03:14.858 ERROR 1 --- [  XNIO-1 task-2] org.thymeleaf.TemplateEngine             : [THYMELEAF][XNIO-1 task-2] Exception processing template "/": Error resolving template [/], template might not exist or might not be accessible by any of the configured Template Resolvers
shinyproxy-server_1  | org.thymeleaf.exceptions.TemplateInputException: Error resolving template [/], template might not exist or might not be accessible by any of the configured Template Resolvers
                       ...
shinyproxy-server_1  |
shinyproxy-server_1  | 2021-02-15 21:03:14.861 ERROR 1 --- [  XNIO-1 task-2] io.undertow.request                      : UT005023: Exception handling request to /app/error
shinyproxy-server_1  |
shinyproxy-server_1  | org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [/], template might not exist or might not be accessible by any of the configured Template Resolvers

이 μ‹œν€€μŠ€λŠ” ShinyProxyκ°€ ν¬κΈ°ν•˜κ³  μœ„μ™€ 같이 일반적인 springboot 였λ₯˜ νŽ˜μ΄μ§€λ‘œ λ€ν”„ν•˜κΈ° 전에 μ•½ 2초 λ™μ•ˆ 7번 λ°˜λ³΅λ©λ‹ˆλ‹€. 두 가지 ꢁ금증:

1) org.springframework.security.authentication.CredentialsExpiredException: Authentication statement is too old to be used with value 2021-02-15T15:51:35.161Z -- 이것이 문제의 근본인 것 κ°™μ§€λ§Œ 이것이 IdP 츑의 λ¬Έμ œμΈμ§€ ShinyProxy 츑의 λ¬Έμ œμΈμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

2) 2021-02-15 21:03:14.861 ERROR 1 --- [ XNIO-1 task-2] io.undertow.request : UT005023: Exception handling request to /app/error -- λ‚΄ 였λ₯˜ ν…œν”Œλ¦Ώμ΄ μ œλŒ€λ‘œ λ‘œλ“œλ˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ μ‚¬μš©μžκ°€ μ„Έμ…˜μ„ μž¬μ„€μ •ν•˜κΈ° μœ„ν•΄ 클릭할 수 μžˆλŠ” "λ‘œκ·Έμ•„μ›ƒ" νŽ˜μ΄μ§€μ— λŒ€ν•œ 링크λ₯Ό 넣을 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μ–΄λ–€ 아이디어?

κ΄€λ ¨λœ 링크듀:

1) https://stackoverflow.com/questions/48289763/spring-security-infinite-loop-after-initial-login-and-timeout
2) https://stackoverflow.com/questions/30528636/idp-initiated-saml-login-error-authentication-statement-is-too-old-to-be-used

링크 2λŠ” λͺ‡ 가지 μ†”λ£¨μ…˜μ„ μ œμ•ˆν•©λ‹ˆλ‹€. (1) maxAuthenticationAge λ₯Ό ADFS의 수λͺ…에 λ§žμΆ”κ±°λ‚˜ (2) forceAuthN λ₯Ό true둜 μ„€μ •ν•©λ‹ˆλ‹€.

ShinyProxy ꡬ성 λ‚΄μ—μ„œ 이것이 κ°€λŠ₯ν•©λ‹ˆκΉŒ, μ•„λ‹ˆλ©΄ 이에 ν•„μš”ν•œ μ‚¬μš©μž μ •μ˜ λΉŒλ“œλ₯Ό μ°Ύκ³  μžˆμŠ΅λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš” @jat255

κ·€ν•˜μ˜ κ΄‘λ²”μœ„ν•œ λ³΄κ³ μ„œμ™€ 연ꡬ에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€! 이것은 μš°μ—°μ˜ μΌμΉ˜μž…λ‹ˆλ‹€. 우리 λ°°ν¬μ—μ„œλ„ λ˜‘κ°™μ€ 문제λ₯Ό κ²½ν—˜ν–ˆμŠ΅λ‹ˆλ‹€. μ–΄μ œ λ‚˜λŠ” λ‹Ήμ‹ κ³Ό 같은 μ†”λ£¨μ…˜μ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ λ§Œν•˜λ©΄λ©λ‹ˆλ‹€. :)

forceAuthN μ˜΅μ…˜μ„ μ„€μ •ν•˜λ©΄ μ‹€μ œλ‘œ λ¬Έμ œκ°€ ν•΄κ²°λ©λ‹ˆλ‹€. μ΄κ²ƒμ˜ μœ μΌν•œ 단점은 μ‚¬μš©μžκ°€ 전체 자격 증λͺ…을 λ‹€μ‹œ μ œκ³΅ν•΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 반면 ADFSλŠ” μ‚¬μš©μžμ˜ 자격 증λͺ…이 μ—¬μ „νžˆ "μΆ©λΆ„νžˆ μ΅œμ‹  μƒνƒœ"라고 λ―ΏμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ œκ³΅ν•œ λ§ν¬μ—μ„œ 일뢀 IDPκ°€ 이 μ˜΅μ…˜(예: google)을 λ¬΄μ‹œν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. saml κ΅¬μ„±μ—μ„œ μ§€μ •ν•˜μ—¬ forceAuthN λ₯Ό ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

proxy:
  saml:
    idp-metadata-url: ... 
    ....
    force-authn: true

이 μ˜΅μ…˜μ€ 아직 저희 μ›Ήμ‚¬μ΄νŠΈμ— λ¬Έμ„œν™”λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ œκ°€ μ²˜λ¦¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

maxAuthenticationAge μ˜΅μ…˜μ„ μ§€μ •ν•˜λŠ” 것은 ShinyProxyμ—μ„œ 아직 κ΅¬ν˜„λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 μ˜΅μ…˜(예: google을 IDP둜 μ‚¬μš©)μ—μ„œ 값을 λ³΄μ•˜μœΌλ―€λ‘œ 이에 λŒ€ν•œ μ˜΅μ…˜μ„ κ΅¬ν˜„ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ˜ν•œ CredentialsExpiredException 경우 더 μœ μš©ν•œ λ™μž‘μ„ μ œκ³΅ν•˜λ„λ‘ λ…Έλ ₯ν•˜κ² μŠ΅λ‹ˆλ‹€.

@LEDfan κ·€ν•˜μ˜ μ‹ μ†ν•œ λ‹΅λ³€κ³Ό μ†”λ£¨μ…˜μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€! ν•΄λ‹Ή λ³€κ²½ 사항을 κ΅¬ν˜„ν–ˆμ§€λ§Œ 이제 μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜λ €λ©΄ 24μ‹œκ°„μ„ κΈ°λ‹€λ €μ•Ό ν•©λ‹ˆλ‹€.smirk: 적어도 SAML νŽ˜μ΄λ‘œλ“œμ— ForceAuthn="true" κ°€ ν‘œμ‹œλ˜λŠ” 것을 ν™•μΈν–ˆμœΌλ―€λ‘œ μ˜΅μ…˜μ΄ ShinyProxyμ—μ„œ ν™•μ‹€νžˆ μž‘λ™ν•©λ‹ˆλ‹€. μ˜†.

λŒ€λΆ€λΆ„μ˜ μ‚¬μš©μžκ°€ μžλ™ ​​Windows 자격 증λͺ… 관리와 μ—°κ²°λœ μ—”ν„°ν”„λΌμ΄μ¦ˆ 인증을 μ‚¬μš©ν•˜λ―€λ‘œ forceAuthN μ˜΅μ…˜μ΄ μ‚¬μš©μžμ—κ²Œ λ„ˆλ¬΄ 어렡지 μ•Šμ„ 것이라고 μƒκ°ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ•‘μ„ΈμŠ€ν•˜κΈ° μœ„ν•΄ μ•”ν˜Έλ₯Ό μž…λ ₯ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. SAML둜 λ³΄ν˜Έλ˜λŠ” λ¦¬μ†ŒμŠ€. 우리의 κ²½μš°μ— νš¨κ³Όκ°€ μžˆμ—ˆλŠ”μ§€ μ•Œλ €λ“œλ¦¬κΈ° μœ„ν•΄ λ©°μΉ  후에 여기에 λ‹€μ‹œ λ³΄κ³ ν•˜κ² μŠ΅λ‹ˆλ‹€.

이것은 μ§€λ‚œ λ©°μΉ  λ™μ•ˆ μž‘λ™ν•˜λŠ” 것 κ°™μœΌλ―€λ‘œ(λ‹€μ‹œ 였λ₯˜λ₯Ό λ³Έ 적이 μ—†μŒ) κ³„μ†ν•΄μ„œ 이것을 λ‹«κ² μŠ΅λ‹ˆλ‹€. λ‹€μ‹œ ν•œλ²ˆ κ°μ‚¬ν•©λ‹ˆλ‹€!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰