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,同时临时禁用证书验证(仅测试环境):
并将端口改为636。connection.SessionOptions.SecureSocketLayer = true; connection.SessionOptions.VerifyServerCertificate = (conn, cert) => true; - 方案二:禁用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
相关产品推荐
相关产品推荐

