如何在spring-security中为ADFS设置IdentedAuthenticationContext?

zsohkypk  于 2024-01-09  发布在  Spring
关注(0)|答案(2)|浏览(268)

我用this工具测试了它,我发现我需要身份验证类型:Form和令牌请求:SAML-P(SAML2.0),但我不知道如何配置spring-security在SAML请求中将AuthenticationContext发送为urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport而不是urn:oasis:names:tc:SAML:2.0:ac:classes:Password
所以,与之相反的是:

*认证类型:Windows集成认证
***令牌请求:**SAML-P(SAML 2.0)
***对IdP的请求:**GET https://ospa.company.com/adfs/ls/IdpInitiatedSignOn?LoginToRP=urn:microsoft:adfs:claimsxray& claimtedAuthenticationContext =urn:oasis:names:tc:SAML:2.0:ac:classes:URL
*来自IdP的响应:

  1. <samlp:Response ID="..."
  2. Version="2.0"
  3. IssueInstant="..."
  4. Destination="https://adfshelp.microsoft.com/ClaimsXray/TokenResponse"
  5. Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"
  6. xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  7. ...
  8. <AuthnStatement AuthnInstant="..." SessionIndex="...">
  9. <AuthnContext>
  10. <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos</AuthnContextClassRef>
  11. </AuthnContext>
  12. </AuthnStatement>
  13. </Assertion>
  14. </samlp:Response>

字符串
我需要这个:

*认证类型:表单
***令牌请求:**SAML-P(SAML 2.0)
***对IdP的请求:**GET https://ospa.company.com/adfs/ls/IdpInitiatedSignOn?LoginToRP=urn:microsoft:adfs:claimsxray& appliedAuthenticationContext =urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
*来自IdP的响应:

  1. <samlp:Response ID="..."
  2. Version="2.0"
  3. IssueInstant="..."
  4. Destination="https://adfshelp.microsoft.com/ClaimsXray/TokenResponse"
  5. Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"
  6. xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  7. ...
  8. <AuthnStatement AuthnInstant="..." SessionIndex="...">
  9. <AuthnContext>
  10. <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</AuthnContextClassRef>
  11. </AuthnContext>
  12. </AuthnStatement>
  13. </Assertion>
  14. </samlp:Response>

**更新:**我们使用spring-boot 2.5.5

mm5n2pyu

mm5n2pyu1#

您需要的是AuthenticationEntryPointAuthenticationEntryPoint是您在需要身份验证时告诉Spring Security重定向到何处的方式。
由于您只需要在需要身份验证时重定向,因此可以像这样使用LoginUrlAuthenticationEntryPoint

  1. @Bean
  2. SecurityFilterChain app(HttpSecurity http) throws Exception {
  3. String url = "https://ospa.company.com/adfs/ls/IdpInitiatedSignOn? LoginToRP=urn:microsoft:adfs:claimsxray& RequestedAuthenticationContext=urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport";
  4. AuthenticationEntryPoint entryPoint =
  5. new LoginUrlAuthenticationEntryPoint(url);
  6. http
  7. .authorizeHttpRequests((authorize) -> authorize
  8. .anyRequest().authenticated()
  9. )
  10. .saml2Login(withDefaults())
  11. .exceptionHandling((exceptions) -> exceptions
  12. .authenticationEntryPoint(entryPoint)
  13. );
  14. return http.build();
  15. }

字符串
还请确保使用IdP的相应元数据配置应用程序。

展开查看全部
bq3bfh9z

bq3bfh9z2#

以下配置对我有效:

  1. @Configuration
  2. public class SamlConfiguration {
  3. @Bean
  4. Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) {
  5. RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations);
  6. OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver);
  7. authenticationRequestResolver.setAuthnRequestCustomizer((context) -> context.getAuthnRequest().setRequestedAuthnContext(buildRequestedAuthnContext()));
  8. return authenticationRequestResolver;
  9. }
  10. private RequestedAuthnContext buildRequestedAuthnContext() {
  11. // Create AuthnContextClassRef
  12. AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder();
  13. AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject(SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX);
  14. authnContextClassRef.setURI(AuthnContext.PPT_AUTHN_CTX);
  15. // Create RequestedAuthnContext
  16. RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder();
  17. RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject();
  18. requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT);
  19. requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef);
  20. return requestedAuthnContext;
  21. }
  22. }

字符串
它生成以下SAML请求:

  1. <saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
  2. AssertionConsumerServiceURL="..."
  3. Destination="..."
  4. ForceAuthn="false"
  5. ID="..."
  6. IsPassive="false"
  7. IssueInstant="..."
  8. ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
  9. Version="2.0"
  10. >
  11. <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">...</saml2:Issuer>
  12. <saml2p:RequestedAuthnContext Comparison="exact">
  13. <saml2:AuthnContextClassRef xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef>
  14. </saml2p:RequestedAuthnContext>
  15. </saml2p:AuthnRequest>


使用Sping Boot 2.7.17进行测试,包括OpenSAML 4.0.1。

展开查看全部

相关问题