【问题标题】:LDAP Change password: Exception from HRESULT: 0x80070547LDAP 更改密码:HRESULT 异常:0x80070547
【发布时间】:2019-11-08 00:20:48
【问题描述】:

我正在尝试从未加入域的计算机上运行我的密码更改应用程序。从加入域的机器运行时,代码运行良好。所以现在,我通过 SSL 使用直接 LDAP 连接连接到 AD。调用 changepassword 方法后,出现错误:

无法从域控制器读取配置信息,原因可能是机器不可用,或者访问被拒绝。 (来自 HRESULT 的异常:0x80070547)。

我正在使用有权更改用户密码的服务帐户建立连接并运行应用程序。

string adminUser = Domain + @"\" + AdminUserName;
string adminPass = AdminUserPassword;
string ldapString = LDAPString;

DirectoryEntry de = new DirectoryEntry(ldapString, adminUser, adminPass, AuthenticationTypes.Secure);
DirectorySearcher deSearch = new DirectorySearcher(de) { SearchRoot = de, Filter = "(&(objectCategory=user)(cn=" + userName + "))" };

SearchResult result = deSearch.FindOne();

if (result != null)
{
    var adContext = new PrincipalContext(ContextType.Domain);
    currentdc = adContext.ConnectedServer;

    DirectoryEntry userEntry = result.GetDirectoryEntry();

    if (userEntry != null)
    {
        userEntry.Invoke("ChangePassword", new object[] { OldPassword, NewPassword });
    }
}

【问题讨论】:

  • ...来自未加入域的机器 ...从加入域的机器运行时工作正常。您的域控制器似乎无法在您的域之外访问。您的异常表明您无法连接到 DC。您的问题与网络和基础设施相关..不是代码实现。
  • 按照你这个问题的措辞,我有点惊讶你提出这个问题..你是不是想问别的?
  • 同样的连接,我可以连接到DC,拉取用户属性值,只是修改密码没有通过。
  • 你确定上面的异常是在userEntry.Invoke上抛出的吗?
  • 绝对确定。

标签: c# asp.net active-directory ldap


【解决方案1】:

调用ChangePassword,调用IADsUser::ChangePassword。该文档说它的工作原理与IADsUser::SetPassword 大致相同。该文档有更多信息。确实,当您从域外运行时,只有第一种方法有效:

首先,LDAP 提供程序尝试通过 128 位 SSL 连接使用 LDAP。要使 LDAP SSL 成功运行,LDAP 服务器必须安装适当的服务器身份验证证书,并且运行 ADSI 代码的客户端必须信任颁发这些证书的机构。服务器和客户端都必须支持 128 位加密。

我假设您的LDAPString 格式为LDAP://example.com:636:636 是重要部分)。如果您可以读取这样的数据,则 SSL 证书是受信任的。所以这很好。

唯一可能缺少的部分可能是 128 位加密?检查证书,看看它是否可能使用少于 128 位。虽然我会很惊讶。

此答案有一个简短的 sn-p 代码,可用于从任何站点下载证书:https://stackoverflow.com/a/22251597/1202807

只需使用“https://example.com:636”作为“网站”即可。

还有这个:

在 Active Directory 中,调用者必须具有更改密码扩展控制访问权限才能使用此方法更改密码。

您应该确保您用于向 LDAP 进行身份验证的用户帐户确实对您尝试更新的帐户具有更改密码权限。在我们的环境中,Everyone 具有更改密码权限(因为您仍然需要提供旧密码才能执行此操作)。我认为这是默认设置,但值得检查。

【讨论】:

  • 如果我使用 System.DirectoryServices.Protocol 而不是 System.DirectoryServices 会有什么不同吗?
  • 我不能说不知道实际问题是什么。使用 LdapConnection 将是严格符合 RFC 的 LDAP。而DirectoryEntry 实际上只是对 Windows 原生 IADs interfaces 的封装,它也使用 LDAP,但对 Active Directory 做了很多假设。
  • 我认为这是对一个引人注目的问题的一个令人信服的答案;实际上,服务本身是否可以拒绝来自非域机器的写入操作但允许读取操作?
  • @BrettCaswell 您可以通过不为 LDAPS 设置 SSL 证书,以迂回的方式拒绝从网络外部更改密码。用于安全传输新密码的other two ways 要求您在网络内部。但是没有它你仍然可以通过 LDAP 读取数据。
猜你喜欢
  • 2018-11-15
  • 2020-02-29
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多