Active directory Azure应用程序服务Active Directory身份验证访问被拒绝

Active directory Azure应用程序服务Active Directory身份验证访问被拒绝,active-directory,azure-web-app-service,directoryservices,kudu,Active Directory,Azure Web App Service,Directoryservices,Kudu,我们有一个web应用程序,我们正在从Azure经典云服务过渡到应用程序服务web应用程序。经典的云服务是在一个包含我们的域控制器(常规广告,而不是Azure广告)的vnet上。应用程序服务使用VNET集成,因此它连接到我们的VNET,从而连接到DCs(基本上通过客户端vpn) 当我们运行在web应用程序中创建新广告的代码时,用户被成功创建,但一旦我们尝试更改任何内容(设置密码、添加到组等),我们就会得到 “访问被拒绝。(来自HRESULT的异常:0x80070005(E_ACCESSDENIED

我们有一个web应用程序,我们正在从Azure经典云服务过渡到应用程序服务web应用程序。经典的云服务是在一个包含我们的域控制器(常规广告,而不是Azure广告)的vnet上。应用程序服务使用VNET集成,因此它连接到我们的VNET,从而连接到DCs(基本上通过客户端vpn)

当我们运行在web应用程序中创建新广告的代码时,用户被成功创建,但一旦我们尝试更改任何内容(设置密码、添加到组等),我们就会得到

“访问被拒绝。(来自HRESULT的异常:0x80070005(E_ACCESSDENIED))”

我们用来创建和编辑帐户的用户可以通过云服务正常工作,因此这不是广告权限问题

为了简化调试,我编写了一些Powershell,可以在Kudu控制台中运行,看看是否可以捕获错误:

$DomainControllerIpAddress = "< domain controller IP>"
$domain   = "<domain name>"


$BaseDN=  "LDAP://$($DomainControllerIpAddress)"
$domAdmin = "domain\adminaccount"
$domPass  = "<password>"

$userdn = "CN=TestUser,OU=TestOU,OU=ParentOU,DC=domain,DC=local"

$pass = "<newuserpassword>"

$userobj = New-Object System.DirectoryServices.DirectoryEntry($basedn + "/" + $userdn), $domAdmin, $domPass

$userobj.AuthenticationType = @("Secure","Sealing") # adding this to try to force kerberos makes no difference

$userobj.Invoke("SetPassword",$pass) # this fails in the App service but works fine everywhere else
$DomainControllerIpAddress=“”
$domain=“”
$BaseDN=“LDAP://$($DomainControllerIpAddress)”
$domAdmin=“域\管理员帐户”
$domPass=“”
$userdn=“CN=TestUser,OU=TestOU,OU=ParentOU,DC=domain,DC=local”
$pass=“”
$userobj=新对象系统.DirectoryServices.DirectoryEntry($basedn+“/”+$userdn),$domAdmin,$domPass
$userobj.AuthenticationType=@(“安全”、“密封”)#添加此项以尝试强制kerberos没有任何区别
$userobj.Invoke(“SetPassword”,$pass)#这在应用程序服务中失败,但在其他任何地方都可以正常工作
此代码在连接到与应用程序服务相同的DC的本地计算机上运行正常,在一个云服务角色实例上的powershell控制台上运行正常,但在应用程序服务中出现错误


我们可以成功创建用户这一事实证明了ldap连接是有效的,但我无法理解为什么设置密码会出现拒绝访问错误。

我曾就此问题与Microsoft进行过一次工程级别的通话。简而言之,出于“安全原因”,某些类型的呼叫在应用程序服务中受到限制。对SetPassword的调用就是其中之一。 这不是一个bug,而是应用服务产品经理深思熟虑的设计决策

如果从虚拟机执行这些命令,则可以运行这些命令。这就是我们最后要做的。我们在一个具有内部负载平衡器的可用性集中启动了VM。我们部署了一个非常小的具有安全性的.Net核心API,它只为我们进行LDAP调用。
这不是一个非常优雅的解决方案,但它很有效。

您解决过这个问题吗?这几乎和我遇到的问题完全一样。