上个月给一家做仓储的客户做集成,他们内部有 OA、工单、监控、报表四套系统,新员工入职要建四个账号。有人离职时 HR 忘了通知,监控系统里那个账号还留着,能登进去看全公司的设备状态。

LDAP 在认证里干的是哪件事

LDAP 是目录服务协议,本身不产生会话。应用把用户输入的账号密码,按 cn=张三,ou=staff,dc=corp,dc=com 这样的 DN 去 bind 一次,服务端返回成功或失败,认证就结束了。目录里通常还挂着 mail、telephoneNumber、memberOf 这些属性,权限判断靠读这些字段。查询用 uid 或 sAMAccountName 过滤,明文走 389 端口,加密走 636。

bind 通过为什么还不叫单点登录

每套系统各自 bind,用户还是要在每个系统里输一次密码,改密码得四处改。真正的单点登录需要一张中心票据:用户在统一入口认证一次,拿到 ticket,其他系统拿 ticket 去中心校验,换回用户名,全程不再碰密码。所以 LDAP 是账号来源,CAS、OAuth2、SAML 是票据通道,两者是接力关系,不是替代关系。

实际项目里的三种组合

  • LDAP 加 CAS:CAS 服务端连 LDAP 做认证,各应用接 CAS 客户端,内网自建最常见,改造成本集中在登录跳转。
  • LDAP 加 OIDC:用 Keycloak 或 ADFS 当身份提供方,应用走标准 OIDC,适合还要接外部合作方系统。
  • 直接对接 AD:Windows 域内用 Kerberos 免密,浏览器要配信任站点白名单,否则拿不到当前登录用户。

落地时最常踩的四个坑

DN 里的逗号、加号要做转义,用户名叫 张三,测试 的时候 bind 必然失败。AD 环境登录名是 sAMAccountName,而 userPrincipalName 带 @ 后缀,两个都要试一遍再报错。密码过期和账号锁定返回的是 49 号错误下的 52e 与 775,得在页面上翻译成人话,别把原始错误码抛给业务人员。用 636 端口时把 CA 证书导进应用的信任库,不然握手阶段就报 certificate unknown。

  • 规模判断:用户不到五百、系统不超过三套,应用直连 LDAP 就够,不必为省事上一整套 CAS。
  • 留本地兜底账号:LDAP 挂了管理员还能登进去修,这条比任何高可用方案都实在。