标签: spring-security-saml2

如何使用spring-security-saml2配置服务提供者以使用EncryptedAssertions?

我正在使用这个出色的repo vdenotaris / spring-boot-security-saml-sample作为指南,并且尝试将其设置为验证和解密包含的传入SAML消息EncryptedAssertion

idP的元数据定义XML中的签名和加密密钥。这是在服务提供商中设置的。

@Bean
public ExtendedMetadata extendedMetadata() {
    ExtendedMetadata extendedMetadata = new ExtendedMetadata();
    extendedMetadata.setIdpDiscoveryEnabled(false);
    extendedMetadata.setSignMetadata(false);
    extendedMetadata.setEcpEnabled(true);
    return extendedMetadata;
}

@Bean
@Qualifier("metadata")
public CachingMetadataManager metadata() throws MetadataProviderException {
    List<MetadataProvider> providers = new ArrayList<MetadataProvider>();

    try {
        ClasspathResource metadata = new ClasspathResource("/metadata/the-idp-metadata.xml");
        Timer timer = new Timer(true);
        ResourceBackedMetadataProvider provider = new ResourceBackedMetadataProvider(timer, metadata);
        provider.setParserPool(ParserPoolHolder.getPool());
        provider.initialize();

        ExtendedMetadataDelegate exMetadataDelegate = new ExtendedMetadataDelegate(provider, extendedMetadata());
        exMetadataDelegate.setMetadataTrustCheck(true);
        exMetadataDelegate.setMetadataRequireSignature(false);
        providers.add(exMetadataDelegate);
    }
    catch(ResourceException ex) {
        throw new MetadataProviderException(ex.getMessage(), ex);
    }

    CachingMetadataManager cmm = new CachingMetadataManager(providers); …
Run Code Online (Sandbox Code Playgroud)

java spring-security saml-2.0 spring-boot spring-security-saml2

15
推荐指数
1
解决办法
568
查看次数

Spring SAML:在使用版本1.0.4.RELEASE作为maven依赖时无法找到工件

我试图使用spring-security-saml2-core-1.0.4.RELEASEmaven依赖项为我的项目,遇到两个问题mvn install:

  1. 失败"Could not find artifact xml-apis:xml-apis:jar:1.4 ... ".我还没有在Maven存储库和build.gradle文件中列出的存储库中找到1.4版本的xml-apis依赖.作为一种解决方法,我被迫在项目中添加略有不同版本的显式依赖:

    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>1.4.01</version>
        <scope>runtime</scope>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 失败:"Could not find artifact org.opensaml:opensaml:jar:2.6.6 ..." and "Could not find artifact ca.juliusdavies:not-yet-commons-ssl:jar:0.3.17 ...".作为一种解决方法,我被迫添加显式的maven存储库,在那里我能够找到项目的工件:

    <repository>
        <id>alfresco</id>
        <name>Alfresco</name>
        <url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url>
    </repository>
    <repository>
        <id>mulesoft</id>
        <name>Mulesoft</name>
        <url>http://repository.mulesoft.org/releases/</url>
    </repository>
    
    Run Code Online (Sandbox Code Playgroud)

是否可以在不声明显式依赖关系和存储库的情况下处理构建问题?

提前谢谢你,Artur.

maven-dependency spring-security-saml2

10
推荐指数
1
解决办法
2712
查看次数

Spring Security SAML 断言到角色转换

我一直在 Spring Boot 2.5.6 中使用 SAML 2.0,并使用 Okta 作为身份提供者。在大多数情况下,我已经能够创建 Web 应用程序并与 Okta 的身份提供商集成。我面临的问题与角色有关。我在 Okta 中分配的组不会转换为 Spring Security 中的角色,并且不清楚这种转换应该如何在 Spring Security for SAML 中发生。在 SAML 断言中,组属性被命名为“groups”,我可以在作为响应一部分出现的断言 XML 中看到这一点。但 Spring Security 并不将“组”属性理解为角色。

身份验证后,SAML2Authentication 对象包含作为 ROLE_USER 的权限。如何将 Assertion 中传入的组属性转换为 SAML2Authentication 中的适当权限?如果没有它,我无法将应用程序 URL 配置为正确的授权角色。

请帮助或指出我的方向

java spring-security saml-2.0 okta spring-security-saml2

7
推荐指数
1
解决办法
2520
查看次数

Spring Security SAML2 为它们动态选择 IDP 或动态 URL

我们正在尝试在应用程序中配置多个身份提供者以支持不同类型的 SSO。问题在于,对于未经身份验证的请求,应用程序不知道要重定向到哪个 IDP。我们可以根据域名确定使用哪个IDP。那不是问题。问题是更改过滤器重定向到该特定 IDP 的方式,而不是第一个找到的 IDP。

我想知道是否有一种简单的方法可以在 Spring Security 或其 SAML2 库中支持它。

我可以以某种方式修改元数据以将其重定向到我自己的 URL(然后在那里有一些自定义代码),或者让身份验证过滤器根据某些标准选择正确的 IDP。

更新

当前 yaml 配置:

spring:
  security:
    saml2:
      relyingparty:
        registration:
          idpone:
            identityprovider:
              entity-id: https://idpone.com
              sso-url: https://idpone.com
              verification: 
                credentials:
                - certificate-location: "classpath:saml/idpone.crt"
          idptwo:
            identityprovider:
              entity-id: https://idptwo.com
              sso-url: https://idptwo.com
              verification: 
                credentials:
                - certificate-location: "classpath:saml/idptwo.crt"
Run Code Online (Sandbox Code Playgroud)

java spring spring-security saml-2.0 spring-security-saml2

6
推荐指数
1
解决办法
2872
查看次数

从 spring-security-saml2-core 升级到 Spring Security SAML2 服务提供者

我们使用 spring-security-saml2-core 进行 Web 应用程序的 SSO Okta 集成。

\n

GitHub: https://github.com/spring-projects/spring-security-saml

\n

该项目处于维护模式,将于 2021 年 10 月 6 日终止生命周期。请改用 Spring Security\xe2\x80\x99s SAML 支持。

\n

我需要将 SAML 库升级到 Spring Security SAML2 服务提供程序\n https://docs.spring.io/spring-security/site/docs/current/reference/html5/#servlet-saml2login

\n

有几个问题:

\n

新库(SAML2 服务提供程序)中的 SAMLEntryPoint 等效类或选项是什么?\n从 SP 启动 SSO 流程的过程是什么?

\n

spring spring-security okta spring-security-saml2

6
推荐指数
0
解决办法
2367
查看次数

使用 Spring Security 的 SAML 2.0 在本地选择身份提供商

我正在使用 Spring Security 的 SAML 2.0 将我的服务提供者连接到多个身份提供者。

Spring 的 SAML 2.0 文档中的所有内容都有意义。我读过许多有用的教程,包括这篇教程,它与我现有的代码类似。

但是,我缺少在哪里以及如何为给定用户选择身份提供者

我了解SAMLDiscovery可用于将身份提供商选择委托给第三方服务。我还了解如何配置多个身份提供商。但我正在寻找一种方法来运行我自己的代码(即检查数据库),然后触发对所选身份提供商(而不是第三方服务)的 SAML 请求。我预计在SAMLEntryPoint被击中时会发生这种情况。我看到提到在初始请求中指定 EntityID。这有关系吗?

我正在尝试执行 SP 发起的 SAML 2.0 SSO。有人可以指出我可以在哪里根据当前用户手动指定 IdP 吗?

java spring spring-security saml-2.0 spring-security-saml2

6
推荐指数
1
解决办法
561
查看次数

在 Spring Security SAML2 中自定义 OpenSaml4AuthenticationProvider

我需要使用UserDetailsServiceSpring Security SAML2 的遗留版本,因此我遵循Spring 的这些说明AuthenticationProvider但是,当我尝试根据该文档将其替换为所谓的“默认”时,我收到错误:

public class WigWebSecurityConfiguration extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity httpSecurity) throws Exception {
    OpenSaml4AuthenticationProvider authenticationProvider = new OpenSaml4AuthenticationProvider();
    // I've tried removing these 2 lines and I get the same error
    authenticationProvider.setAssertionValidator(OpenSaml4AuthenticationProvider.createDefaultAssertionValidator());
    authenticationProvider.setResponseAuthenticationConverter(OpenSaml4AuthenticationProvider.createDefaultResponseAuthenticationConverter());

    httpSecurity.authorizeRequests(authz -> authz.anyRequest().authenticated())
      .saml2Login(saml2 -> saml2.authenticationManager(new ProviderManager(authenticationProvider)));
  }
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时,当我尝试进行身份验证时收到以下错误:

java.lang.NoSuchMethodError: org.opensaml.saml.saml2.assertion.SAML20AssertionValidator.<init>(Ljava/util/Collection;Ljava/util/Collection;Ljava/util/Collection;Lorg/opensaml/saml/saml2/assertion/AssertionValidator;Lorg/opensaml/xmlsec/signature/support/SignatureTrustEngine;Lorg/opensaml/xmlsec/signature/support/SignaturePrevalidator;)V
    at org.springframework.security.saml2.provider.service.authentication.OpenSaml4AuthenticationProvider$SAML20AssertionValidators$3.<init>(OpenSaml4AuthenticationProvider.java:732)
    at org.springframework.security.saml2.provider.service.authentication.OpenSaml4AuthenticationProvider$SAML20AssertionValidators.<clinit>(OpenSaml4AuthenticationProvider.java:731)
    at org.springframework.security.saml2.provider.service.authentication.OpenSaml4AuthenticationProvider.lambda$createDefaultAssertionSignatureValidator$8(OpenSaml4AuthenticationProvider.java:572)
    at org.springframework.security.saml2.provider.service.authentication.OpenSaml4AuthenticationProvider.lambda$createAssertionValidator$11(OpenSaml4AuthenticationProvider.java:654)
    at org.springframework.security.saml2.provider.service.authentication.OpenSaml4AuthenticationProvider.process(OpenSaml4AuthenticationProvider.java:495)
    at org.springframework.security.saml2.provider.service.authentication.OpenSaml4AuthenticationProvider.authenticate(OpenSaml4AuthenticationProvider.java:448)
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)
    at org.springframework.security.saml2.provider.service.servlet.filter.Saml2WebSsoAuthenticationFilter.attemptAuthentication(Saml2WebSsoAuthenticationFilter.java:113)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:222)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
Run Code Online (Sandbox Code Playgroud)

但是,当我使用相同的代码而不设置 …

spring-security spring-security-saml2

6
推荐指数
1
解决办法
5652
查看次数

Keycloak 和 Spring SAML:SigAlg 为 null

我正在尝试使用 Spring Security、Spring Security SAML 和 Keycloak 设置 POC。为此,我使用 Spring SAML 核心项目提供的 simple-service-provider 示例。

只要 Keycloak 不需要客户端签名(“需要客户端签名”已禁用),我就设法使 SAML 设置正常工作。当我启用此选项时,我在 Keycloak 中收到以下错误和堆栈跟踪

07:07:40,385 WARN  [org.keycloak.events] (default task-8) type=LOGIN_ERROR, realmId=ea-localhost, clientId=null, userId=null, ipAddress=172.17.0.1, error=invalid_signature
07:07:44,961 ERROR [org.keycloak.protocol.saml.SamlService] (default task-7) request validation failed: org.keycloak.common.VerificationException: SigAlg was null
        at org.keycloak.protocol.saml.SamlProtocolUtils.verifyRedirectSignature(SamlProtocolUtils.java:135)
        at org.keycloak.protocol.saml.SamlService$RedirectBindingProtocol.verifySignature(SamlService.java:518)
        at org.keycloak.protocol.saml.SamlService$BindingProtocol.handleSamlRequest(SamlService.java:233)
        at org.keycloak.protocol.saml.SamlService$BindingProtocol.execute(SamlService.java:478)
        at org.keycloak.protocol.saml.SamlService.redirectBinding(SamlService.java:553)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Run Code Online (Sandbox Code Playgroud)

Spring配置如下

spring:
  thymeleaf:
    cache: false
  security:
    saml2:
      service-provider:
        entity-id: spring-saml-test
        sign-metadata: false
        sign-requests: true
        want-assertions-signed: true
        keys:
          active:
            - name: key …
Run Code Online (Sandbox Code Playgroud)

spring spring-security saml-2.0 keycloak spring-security-saml2

5
推荐指数
1
解决办法
7189
查看次数

反向代理背后的 Spring Security SAML

我已在本地开发平台上成功将 SSO/SAML2 与 Spring Security SAML 集成。

现在,我想将其安装在反向代理后面的生产环境中。反向代理配置如下: https://mycustomer.company.com/api/auth/xxx重定向到http://local_ip:local_port/auth/xxx

我遵循了 SAMLContextProviderLB bean 配置(第 10.1 章 - https://docs.spring.io/spring-security-saml/docs/current-SNAPSHOT/reference/pdf/spring-security-saml-reference.pdf)。

但登录成功后,我被重定向到这个无效的网址:http ://mycustomer.company.com**/auth/**

我认为它来自#successRedirectHandler bean。但是,如果我输入正确的 URL ( https://mycustomer.company.com/api/auth/index.jsp ),我会在 SAML 识别过程中无限循环(返回到 IDP,然后是 SDP...)。

我当然误解了配置中的某些内容,但我看不出在哪里。感谢您的帮助。

spring reverse-proxy spring-security spring-security-saml2

5
推荐指数
0
解决办法
556
查看次数

无法更改 Spring security SAML SSO 中的默认“回复 Url”(断言消费者服务位置)

我使用spring security Saml 2.0和 spring boot 进行 SSO(单点登录),并使用 azure 作为身份提供者。

Spring security 使用“{baseUrl}/login/saml2/sso/{registrationId}”作为默认“回复 Url”,

但我想使用“{baseUrl}/login/{registrationId}”

所以按照 我写的官方文档

RelyingPartyRegistration relyingPartyRegistration = RelyingPartyRegistrations
                .fromMetadataLocation("https://login.microsoftonline.com/<metadata url>")
                .registrationId("azure")
                .entityId("{baseUrl}")
                .assertionConsumerServiceLocation("{baseUrl}/login/{registrationId}")
                .build();
Run Code Online (Sandbox Code Playgroud)

通过这个我进入登录页面,但之后有登录的无限循环......

Spring boot 无法 POST 到 /login/azure

o.s.security.web.FilterChainProxy        : Securing POST /login/azure
s.s.w.c.SecurityContextPersistenceFilter : Set SecurityContextHolder to empty SecurityContext
o.s.security.web.csrf.CsrfFilter         : Invalid CSRF token found for http://localhost:8080/login/azure
o.s.s.w.access.AccessDeniedHandlerImpl   : Responding with 403 status code
Run Code Online (Sandbox Code Playgroud)

我试图允许此端点的 CSRF 并允许所有访问,但随后它无法解析元数据。

我发现它是在过滤器“Saml2WebSsoAuthenticationFilter”中实现的

spring spring-security spring-boot spring-saml spring-security-saml2

5
推荐指数
1
解决办法
3291
查看次数