作为 Azure 应用服务运行时,UserPrincipal.DisplayName 抛出 COMException“访问被拒绝”,在本地开发笔记本电脑上工作正常

Posted

技术标签:

【中文标题】作为 Azure 应用服务运行时,UserPrincipal.DisplayName 抛出 COMException“访问被拒绝”,在本地开发笔记本电脑上工作正常【英文标题】:UserPrincipal.DisplayName throws COMException "Access is denied" when running as Azure App Service, working fine on local dev laptop 【发布时间】:2020-06-12 11:54:15 【问题描述】:

我一直在为这个问题而烦恼,一直在堆栈溢出,但仍然无法修复它。

目标

我正在尝试在 Windows Server 2019 Azure VM 上按需创建帐户。 VM 未加入域,只是该孤独工作组中的独立服务器。该应用程序是一个 ASP.NET Framework v4.6.1 Web API 应用程序,在 Azure 中作为应用服务运行。

    using (var context = new PrincipalContext(ContextType.Machine, vmData["ip"].ToString(), null, ContextOptions.Negotiate, $@"vmData["name"]\vmData["username"]", vmData["password"].ToString()))
    
        using (var user = new UserPrincipal(context))
        

            user.DisplayName = username;
            user.SamAccountName = username;
            user.SetPassword(password);
            user.PasswordNeverExpires = true;

            user.Save();

            using (var group = GroupPrincipal.FindByIdentity(context, "Administrators"))
            
                group.Members.Add(user);
                group.Save();
            
        
    

问题

在本地运行此代码时一切正常,与 Azure VM 的连接成功,用户已创建并添加到服务器上的本地管理员组。

当此代码发布到 Azure 中的应用服务时,它总是会在 user.DisplayName = username; 行抛出 System.Runtime.InteropServices.COMException: Access is denied.。我假设在尝试设置 user.Displayname 时以某种方式查询服务器,但用户的属性不需要是唯一的,我从以前的项目中知道,真正检查唯一属性时会发生 Save()用户。

研究和尝试修复

我禁用了允许从应用服务 IP 到 Azure VM 的入站流量的防火墙规则,只是为了查看我是否会遇到不同的异常 => 无法到达超时/服务器。防火墙规则似乎是正确的 我完全禁用了所有防火墙,以确保防火墙规则没有遗漏任何所需的端口或协议 => 访问被拒绝! 我附加了 Visual Studio 以远程调试应用服务,希望从 异常 => 访问被拒绝,仅此而已。 从PSEXEC, access denied errors 尝试修复 发现使用 .NET 4.5 时存在错误.NET 4.5 Bug in UserPrincipal.FindByIdentity (System.DirectoryServices.AccountManagement) => 使用 4.6.1 检查远程服务器以确认正在创建的帐户不存在 检查了远程服务器事件日志中可能与此问题、登录失败、审核等相关的任何日志。什么都找不到。

不得已

此时我即将在这些虚拟机上启用 OpenSSH 并开始尝试以这种方式创建本地帐户。

有没有人知道去哪里找,还有其他可以尝试的东西?

提前致谢!

更新 1:

我已将项目从 .NET Framework v4.6.1 更改为 v4.7.2,因为 Azure 应用服务运行 .NET v3.5 或 .NET v4.7。

Screenshot of Azure App Service configuration displaying .NET v4.7 setting

希望这可以在我的本地机器上产生相同的异常,我再次进行了测试,它确实在同一行抛出了 COMException。但是它不是同一个 COMException。

System.Runtime.InteropServices.COMException: Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again.

由于我刚刚对 v4.7.2 进行了更改,因此我仍在研究这个新异常,只是认为这些额外信息对于添加到原始问题可能很重要。

【问题讨论】:

这个运气好吗?我在将用户从一个 OU 移动到另一个 OU 时遇到了类似的问题。它可以在本地或加入域的任何计算机上正常工作,但在 Azure 应用服务中失败。 【参考方案1】:

Azure 应用服务似乎阻止了某些 LDAP/Active Directory 交互。

查看以下问题/答案: Azure App Service Active Directory Authentication Access Denied

authO 写了一篇使用 LdapConnection(也是 .Net 的一部分)的文章。我已经能够使用该库而不是 PrincipalContext 或 DirectoryEntry 成功完成一些工作。

https://github.com/auth0-blog/blog-ldap-csharp-example/blob/master/LDAPClient/LDAPClient/Client.cs

【讨论】:

以上是关于作为 Azure 应用服务运行时,UserPrincipal.DisplayName 抛出 COMException“访问被拒绝”,在本地开发笔记本电脑上工作正常的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure SQL 服务器作为后端数据库运行 Apache Airflow

发件人停止运行时 Azure 服务总线队列 ScheduledEnqueueTimeUtc 的行为

使 Azure Webjob 计时器触发器不作为单例运行

使用 Azure 时如何解决此错误“AddressAccessDeniedException”?

Azure - 将 WCF 服务作为 WebJob 运行

WinSCP 无法在 Azure 应用服务上作为 WebJob 运行