我尝试使用
System.DirectoryServices.AccountManagement
包通过站点到站点 VPN 从 Azure 应用服务上运行的 Web 应用程序访问本地服务器上的 Active Directory。以下内容按预期工作,并按预期禁用用户帐户:
adContext = new PrincipalContext(ContextType.Domain, "10.0.0.1", c.Username, c.Password);
u = UserPrincipal.FindByIdentity(adContext, user.UserPrincipalName;
u.Enabled = false;
u.Save();
但是,当我尝试以下操作时,出现错误
System.UnauthorizedAccessException:访问被拒绝。 (0x80070005(E_ACCESSDENIED))
关于
SetPassword
方法:
adContext = new PrincipalContext(ContextType.Domain, "10.0.0.1", c.Username, c.Password);
u = UserPrincipal.FindByIdentity(adContext, user.UserPrincipalName;
u.SetPassword(response.Replace(" ", "-"));
我相当确定这不是我的凭据或服务器连接的问题,因为启用/禁用命令工作正常,并且直接从 Visual Studio 运行时程序可以正常执行。
PrincipalContext
命令中提供的 AD 凭据具有用于测试目的的域管理员权限。仅当应用程序发布到 Azure 应用服务时才会发生此行为。
我尝试了各种不同的
ContextOptions
和连接字符串的变体。我读过,可能的解决方案可能是在建立与 AD 的连接时使用 SSL 和 PrincipalContext
,但是当我尝试实现此方法时,我收到了不同的错误:
无法联系服务器:System.DirectoryServices.Protocols.LdapException:LDAP 服务器不可用。
为了使其正常工作,我尝试将 LDAPS 的端口号附加到连接字符串的末尾:
adContext = new PrincipalContext(ContextType.Domain, "10.0.0.1:636", c.Username, c.Password);
还将 SSL 的上下文选项添加到命令中。
我可以通过端口 636 远程登录和测试网络连接到服务器,但是当从编译器或应用程序服务执行时,我会得到相同的错误。
我希望有人能够找到并解决我连接到 Active Directory 的方式,从而解决此问题,或者如果答案是通过 SSL 连接,则提供一些帮助,让我通过 SSL 连接到服务器工作。
非常感谢
经过进一步的搜索和反复试验,我设法解决了这个问题。事实证明,访问被拒绝异常的原因是连接没有使用 SSL,一旦我设法配置 SSL,它就开始工作了!
SSL 的问题是我使用的是域控制器的 IP 地址而不是 FQDN。用于连接 LDAPS 的字符串似乎必须与证书上的名称匹配。然后我添加了上下文选项:协商、SSL 和 ServerBind,连接成功。