运行ASP.NET Web应用提示用户名或密码不正确错误如何解决
问题排查与解决方案
1. 校验LDAP连接与绑定身份配置
- 首先确认web.config中AppSettings节点的LDAP配置值是否正确,标准格式为
LDAP://你的域地址/DC=你的域名,DC=后缀,注意协议头LDAP必须为大写,路径后缀的域组件需要和实际AD域配置完全匹配。 - 当前代码创建
DirectoryEntry对象时没有显式传入账号密码,默认会使用当前Web进程的身份进行LDAP绑定,若需要跨域访问或指定AD查询身份,需要修改第12行代码,传入拥有AD查询权限的账号密码:
' 用户名格式支持 域\账号 或 账号@域地址 两种形式 Dim de As System.DirectoryServices.DirectoryEntry = New System.DirectoryServices.DirectoryEntry(LDAP, ad查询账号, ad查询密码)
- 若确认要使用应用程序池身份绑定,需要先检查应用程序池配置的身份账号密码未过期、未被域锁定,且该账号拥有AD查询权限,修改应用池身份后必须回收应用池才会生效。
2. 校验用户名解析逻辑
- 确认第11行的
userName变量取值是否为域\账号格式,若不存在\字符,IndexOf('\')会返回-1,导致sAMAccountName取值错误,最终查询的账号名与AD存储值不匹配。 - 可以增加临时日志输出
sAMAccountName的实际取值,确认和AD中对应用户的sAMAccountName属性一致。
3. 排除AD访问连通性问题
- 可以在Web服务器本地使用系统自带的ldp.exe工具,输入对应LDAP地址和绑定账号密码执行查询测试,确认可以正常返回用户结果,排除服务器到AD域控制器的网络连通问题、端口拦截问题(LDAP默认端口389,SSL模式端口636)。
4. 补充防御性代码
- 第15行
FindOne()如果未匹配到用户会返回空值,后续直接读取Properties会触发空引用异常,建议增加空值判断:
Dim result As System.DirectoryServices.SearchResult = ds.FindOne() If result IsNot Nothing Then dim qq=result.Properties("memberOf") dim sid=BitConverter.ToString(result.Properties("objectSID")(0)) End If
内容的提问来源于stack exchange,提问作者godpick
相关产品推荐
相关产品推荐

