调用 UserPrincipal 方法时访问被拒绝

问题描述 投票:0回答:1

我尝试使用

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 连接到服务器工作。

非常感谢

c# ssl active-directory ssl-certificate principalcontext
1个回答
0
投票

经过进一步的搜索和反复试验,我设法解决了这个问题。事实证明,访问被拒绝异常的原因是连接没有使用 SSL,一旦我设法配置 SSL,它就开始工作了!

SSL 的问题是我使用的是域控制器的 IP 地址而不是 FQDN。用于连接 LDAPS 的字符串似乎必须与证书上的名称匹配。然后我添加了上下文选项:协商、SSL 和 ServerBind,连接成功。

© www.soinside.com 2019 - 2024. All rights reserved.