我们有一个 Web 应用程序,正在从 Azure 经典云服务过渡到应用服务 Web 应用程序。经典云服务位于包含我们的域控制器(常规 AD,而不是 Azure AD)的 vnet 上。应用程序服务使用 VNET 集成,因此它连接到我们的 vnet,从而连接到 DC(本质上通过客户端 VPN)。
当我们运行在网络应用程序中创建新 AD 的代码时,用户已成功创建,但是一旦我们尝试更改任何内容 - 设置密码、添加到组等,我们就会得到
“访问被拒绝。(HRESULT 异常:0x80070005 (E_ACCESSDENIED))”
我们用来创建和编辑帐户的用户可以在云服务中正常工作,因此这不是 AD 权限问题。
为了尝试简化调试,我编写了一些 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
此代码从连接到与应用服务相同的 DC 的本地计算机运行良好,并且从云服务角色实例之一上的 powershell 控制台运行良好,但从应用服务出现错误。
我们可以成功创建用户这一事实证明 ldap 连接有效,但我无法理解为什么设置密码会出现访问被拒绝错误。