C# UserPrincipal.SetPassword在Azure网站上引发UnauthorizedAccessException

C# UserPrincipal.SetPassword在Azure网站上引发UnauthorizedAccessException,c#,azure,active-directory,C#,Azure,Active Directory,我可以使用System.DirectoryServices.AccountManagement成功设置用户密码,方法是: using (var up = new UserPrincipal(principalContext)) { up.SetPassword(password); } 但是,当我从Azure网站执行相同的代码时,它会抛出一个UnauthorizedAccessException表示访问被拒绝。。这是stacktrace: 位于System.DirectoryServic

我可以使用System.DirectoryServices.AccountManagement成功设置用户密码,方法是:

using (var up = new UserPrincipal(principalContext))
{
   up.SetPassword(password);
}
但是,当我从Azure网站执行相同的代码时,它会抛出一个
UnauthorizedAccessException
表示
访问被拒绝。
。这是stacktrace:

位于System.DirectoryServices.DirectoryEntry.Invoke(String methodName,Object[]args)
位于System.DirectoryServices.AccountManagement.SDSUtils.SetPassword(DirectoryEntry de,字符串newPassword)
位于System.DirectoryServices.AccountManagement.ADStoreCtx.SetPassword(AuthenticatablePrincipal p,字符串newPassword)
位于System.DirectoryServices.AccountManagement.PasswordInfo.SetPassword(字符串newPassword)
位于System.DirectoryServices.AccountManagement.AuthenticatablePrincipal.SetPassword(字符串newPassword)
在C:\agent\\u work\a1b9797a\Cdp\src\Cdp.ServiceBus.Adapters\ActiveDirectoryAdapter.CreateUser(字符串用户名,字符串密码)中的Cdp.ServiceBus.Adapters.ActiveDirectoryAdapter.CreateUser处:第46行

Active Directory实例正在Azure VM上运行。该网站连接到同一个虚拟网络。在本地开发时,我使用VPN连接到同一个虚拟网络

principalContext是使用
ContextType.Domain
ContextOptions.Negotiate | ContextOptions.Signing | ContextOptions.Sealing
设置的。我还将虚拟网络的IP地址指定为上下文的名称(即主机)。此上下文的用户名和密码是AD VM中的管理员

查看AD VM的安全日志,我可以看到在本地开发时,会创建一个日志条目,因为我登录的管理员正在尝试重置密码。在Azure上时,不会创建此类日志条目。从这一点上,我想我可以得出这样的结论:这个电话从未收到过。没有其他日志条目向我提供它拥有和/或无法处理的信息

我最好的猜测是Azure不允许执行SetPassword API。这就解释了相当低级的
未授权访问异常
。你觉得怎么样

编辑:

SDSUtils.SetPassword的签名是:

[SecurityCritical]
internal static void SetPassword(DirectoryEntry de, string newPassword)

Azure允许运行带有
SecurityCritical
属性的代码吗?

我用它工作了一段时间,我想我找到了答案。为了使其工作,基础连接必须是安全的:

PrincipalContext _pc = new PrincipalContext(ContextType.Domain, "FQDN", null, ContextOptions.SecureSocketLayer | ContextOptions.Negotiate, _svsUser, _svsPwd);
UserPrincipal _up = UserPrincipal.FindByIdentity(_pc, IdentityType.SamAccountName, usernameToChange);
_up.SetPassword(newPassword);
_up.Save();
注意构造函数调用中的
ConextOptions.SecureSocketLayer | ContextOptions.congotiate
。一旦我添加了这个并在我的DC上配置了SSL,它就开始工作了