You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署的ASP.NET应用无法连接osixia/openldap容器求助

问题描述

本地运行的ASP.NET登录逻辑可正常连接osixia/openldap Docker镜像,但将ASP.NET代码构建为Docker镜像后,该容器无法连接LDAP服务器。同时,使用osixia/phpldapadmin可正常注册和管理用户。

docker-compose配置

version: '3'

services:
  authms:
    image: authms
    container_name: authms_l
    ports:
        - "7049:80"
    environment:
      ASPNETCORE_URLS: "http://+"
      ASPNETCORE_ENVIRONMENT: Development
    links:
      - wings-ldap


  wings-ldap:
    image: osixia/openldap:1.1.8
    container_name: wings-ldap
    environment:
      COMPOSE_HTTP_TIMEOUT: 200
      LDAP_LOG_LEVEL: "256"
      LDAP_ORGANISATION: "Wings"
      LDAP_DOMAIN: "wings.co"
      LDAP_BASE_DN: ""
      LDAP_ADMIN_PASSWORD: "admin"
      LDAP_CONFIG_PASSWORD: "config"
      LDAP_READONLY_USER: "false"
      LDAP_BACKEND: "hdb"
      LDAP_TLS: "true"
      LDAP_TLS_CRT_FILENAME: "ldap.crt"
      LDAP_TLS_KEY_FILENAME: "ldap.key"
      LDAP_TLS_CA_CRT_FILENAME: "ca.crt"
      LDAP_TLS_ENFORCE: "false"
      LDAP_TLS_CIPHER_SUITE: "SECURE256:-VERS-SSL3.0"
      LDAP_TLS_PROTOCOL_MIN: "3.1"
      LDAP_TLS_VERIFY_CLIENT: "demand"
      LDAP_REPLICATION: "false"
      LDAP_REMOVE_CONFIG_AFTER_SETUP: "true"
      LDAP_SSL_HELPER_PREFIX: "ldap"
    tty: true
    stdin_open: true
    volumes:
      - /var/lib/ldap
      - /etc/ldap/slapd.d
      - /container/service/slapd/assets/certs/
    ports:
      - "389:389"
      - "636:636"
    hostname: "wings.co"

  phpldapadmin:
    image: osixia/phpldapadmin:latest
    container_name: ldap_client_w
    environment:
      PHPLDAPADMIN_LDAP_HOSTS: "wings-ldap"
      PHPLDAPADMIN_HTTPS: "false"
    ports:
      - "8095:80"
    links:
      - wings-ldap

ASP.NET连接代码

string ldapServer = "wings-ldap";
int ldapPort = 389;
string ldapUserId = "cn=admin";
string ldapPassword = "admin";
string ldapBaseDn = "dc=wings,dc=co";
using (LdapConnection connection = new LdapConnection(new LdapDirectoryIdentifier(ldapServer, ldapPort))) {
    connection.SessionOptions.ProtocolVersion = 3;
    connection.SessionOptions.SecureSocketLayer = false;
    connection.AuthType = AuthType.Basic;
    NetworkCredential nc = new NetworkCredential("cn=admin,dc=wings,dc=co", "admin");

    connection.Bind(nc);

    string userDn = $"cn={credentials.UserId}," + "ou=sa," + ldapBaseDn;

    string userPassword = credentials.Password;
}
解决方案

1. 验证Docker网络连通性

Docker Compose默认会为所有服务创建并加入同一个自定义网络,但可以手动确认连通性:

  • 进入authms容器:docker exec -it authms_l bash
  • 测试LDAP端口连通性:telnet wings-ldap 389 或 nc -zv wings-ldap 389
  • 如果连通失败,在docker-compose.yml中显式定义网络并让所有服务加入:
    version: '3'
    networks:
      ldap-net:
        driver: bridge
    services:
      authms:
        # 原有配置
        networks:
          - ldap-net
      wings-ldap:
        # 原有配置
        networks:
          - ldap-net
      phpldapadmin:
        # 原有配置
        networks:
          - ldap-net
    

2. 调整LDAP TLS配置

你的LDAP服务开启了TLS,但ASP.NET代码禁用了SSL,可能导致连接失败:

  • 方案一:ASP.NET代码适配TLS
    修改代码开启SSL,同时临时禁用证书验证(仅测试环境):
    connection.SessionOptions.SecureSocketLayer = true;
    connection.SessionOptions.VerifyServerCertificate = (conn, cert) => true;
    
    并将端口改为636。
  • 方案二:禁用LDAP服务的TLS
    修改wings-ldap的环境变量:
    LDAP_TLS: "false"
    

3. 确认用户DN的正确性

检查ou=sa是否已在LDAP中创建:

  • 通过phpldapadmin查看LDAP目录结构,确认是否存在ou=sa组织单元
  • 如果不存在,先创建该单元,再确保用户DN格式正确

4. 检查DNS解析

在authms容器内执行nslookup wings-ldap,确认容器能解析LDAP服务的域名。如果解析失败:

  • 重启Docker服务
  • 临时使用wings-ldap容器的IP进行连接测试(通过docker inspect wings-ldap获取IP)

5. 查看LDAP服务器日志

查看LDAP容器的日志获取错误详情:

docker logs wings-ldap

日志中会显示连接失败的具体原因,比如认证错误、TLS握手失败等,帮助定位问题。

内容的提问来源于stack exchange,提问作者GZs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:10:57