有没有办法过滤/避免 keycloak SAML 断言中的重复属性名称?

Posted

技术标签:

【中文标题】有没有办法过滤/避免 keycloak SAML 断言中的重复属性名称?【英文标题】:Is there a way to filter/avoid duplicate attribute names in keycloak SAML assertions? 【发布时间】:2018-12-03 07:37:40 【问题描述】:

我正在尝试使用 nextcloud (13.0.4) 和 keycloak (4.0.0.Final) 设置 SSO(作为 SSO/SAML IDP 和用户管理解决方案),如 SSO with SAML, Keycloak and Nextcloud 所述。

但是,尝试使用在 keycloak 中配置的 SSO 测试用户登录 nextcloud,nextcloud 抱怨以下错误:

OneLogin_Saml2_ValidationError: Found an Attribute element with duplicated Name

/var/www/html/nextcloud/custom_apps/user_saml/3rdparty/vendor/onelogin/php-saml/lib/Saml2/Auth.php - line 177: OneLogin_Saml2_Response->getAttributes()
/var/www/html/nextcloud/custom_apps/user_saml/lib/Controller/SAMLController.php - line 219: OneLogin_Saml2_Auth->processResponse('ONELOGIN_1111a8...')
[internal function] OCA\User_SAML\Controller\SAMLController->assertionConsumerService()
/var/www/html/nextcloud/lib/private/AppFramework/Http/Dispatcher.php - line 161: call_user_func_array(Array, Array)
/var/www/html/nextcloud/lib/private/AppFramework/Http/Dispatcher.php - line 91: OC\AppFramework\Http\Dispatcher->executeController(Object(OCA\User_SAML\Controller\SAMLController), 'assertionConsum...')
/var/www/html/nextcloud/lib/private/AppFramework/App.php - line 115: OC\AppFramework\Http\Dispatcher->dispatch(Object(OCA\User_SAML\Controller\SAMLController), 'assertionConsum...')
/var/www/html/nextcloud/lib/private/AppFramework/Routing/RouteActionHandler.php - line 47: OC\AppFramework\App main('OCA\\User_SAML\\C...', 'assertionConsum...', Object(OC\AppFramework\DependencyInjection\DIContainer), Array)
[internal function] OC\AppFramework\Routing\RouteActionHandler->__invoke(Array)
/var/www/html/nextcloud/lib/private/Route/Router.php - line 297: call_user_func(Object(OC\AppFramework\Routing\RouteActionHandler), Array)
/var/www/html/nextcloud/lib/base.php - line 999: OC\Route\Router->match('/apps/user_saml...')
/var/www/html/nextcloud/index.php - line 42: OC handleRequest()
main
enter

不知道有没有办法避免/过滤keycloak中重复的属性名来规避这个问题?

我已经设置了一个测试 docker-compose.yml 来显示问题(仅限本地主机,没有 https,即仅用于测试)。

# Use only for testing the BASE_PATH feature
# An unencrypted nextcloud will be accessible at
# http://localhost/$BASE_PATH
version: '3.3'
services:
  app:
    image: aanno/nextcloud:13.0.4-apache
    ports: 
        - 8081:80
    container_name: nextcloud-docker-apache
    volumes:
# Attention: Adapt this to your BASE_PATH
#      - ./apps:/var/www/html/nextcloud/custom_apps
#      - ./config:/var/www/html/nextcloud/config
       - ./data:/var/www/html/nextcloud/data
    environment:
        - BASE_PATH=/nextcloud
    networks:
        - bridge
  keycloak_container:
    image: jboss/keycloak
    container_name: keycloak-server
    ports:
      - 8080:8080
    environment:
      - PROXY_ADDRESS_FORWARDING=true
      # defaults to:
      # -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m
      # -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true
      #- JAVA_OPTS=-Xmx512m
      - DB_VENDOR=h2
      - KEYCLOAK_USER=admin
      - KEYCLOAK_PASSWORD=admin1234
    networks:
        - bridge

networks:
    bridge:
        external:
            name: app

Keycloak 将位于 http://localhost:8080 和 nextcloud 位于 http://localhost:8081/nextcloud 。这个文件也可以在https://github.com/aanno/nextcloud-docker/blob/tp/set-base-url-2/13.0/apache/test/docker-compose.yml 找到。在这里您还可以详细了解 docker 镜像(它基于 13.0-apache 的官方 nextcloud/docker 镜像)。

【问题讨论】:

在我的示例中,我 not 设置了身份提供程序 (idp)。所以我不知道你在那部分的配置是什么。另外,我很想知道为什么你设置它(你的 keycloak + nextcloud 将运行得很好,没有一个)。请edit您的并添加更多详细信息,您如何设置 keycloak 和 nextcloud 以及您尝试使用 idp 的原因。 亲爱的 MadMike,也许我的措辞首先有点模糊,因此我稍微编辑了我的问题。我实际上所做的是逐步遵循您的解决方案(我知道的唯一区别是我为 nextcloud 使用了另一个 docker 映像)。但是,我总是收到提到的错误。 你用什么代替了domain.com?您是否创建了多个用户?您是否直接在 nextcloud 上创建了用户?您使用哪个 docker-image?说到这...请发布您的 docker-compose.yml...删除密码,留下其余的。 我在我的问题中添加了一个 docker-compose 文件以显示问题(在本地主机上)。但我也尝试了一个真实的域(使用 https by let's encrypt)并遇到了同样的问题。 我不知道从哪里开始寻找这种错误。我从来没有过这样的。也许问help.nextcloud.com? 【参考方案1】:

因为我也在 https://github.com/nextcloud/user_saml/issues/222 上发布了这个错误,所以我现在知道了解决方案:您必须激活“单一角色属性”开关。

在 keycloak 4.0.0.Final 中,选项有点隐藏在: (Realm) -> Client Scopes -> role_list (saml) -> Mappers tab -> role list -> 'Single Role Attribute'。

【讨论】:

【参考方案2】:

现在有更好的答案,发布于https://github.com/nextcloud/user_saml/issues/222#issuecomment-648974404

waza-ari 23 天前发表评论

我知道这一页已经很老了,但它是你偶然发现的一页 在寻找这个问题的时候穿过。有比这更好的选择 建议的!建议的选项会更改每个角色的角色列表 领域内的客户。最好覆盖上的设置 客户端级别,以确保它只影响 Nextcloud 客户端。

为此。编辑您的客户,转到客户范围并删除 role_list 来自分配的默认客户端范围。

接下来,创建一个新的 Mapper 来实际映射角色列表:

Name: anything you like
Mapper Type: Role List
Role Attribute name: Role
Friendly Name: Anything you like
SAML Attribute Name Format: Basic
Single Role Attribute: ON

希望这对某人有所帮助。

【讨论】:

以上是关于有没有办法过滤/避免 keycloak SAML 断言中的重复属性名称?的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak SAML 集成

SSO 与 SAML、Keycloak 和 Nextcloud

Keycloak 和 Spring SAML:SigAlg 为空

如何绕过Keycloak登录表单,直接跳转到IDP登录?

Keycloak IdP SAML2 将 XML 元数据导出到 SP

Spring Boot/Angular整合Keycloak实现单点登录