【问题标题】:Accessing Active Directory Records Via ASP.NET通过 ASP.NET 访问 Active Directory 记录
【发布时间】:2014-02-23 09:10:59
【问题描述】:

似乎我的本地计算机没有将数据写入 Active Directory 所需的权限。我可以读取数据但不能更改和更新它。调用 .save() 命令后,我收到下一条消息:“访问被拒绝”。

我不使用任何登录详细信息来登录 Active Directory,我也不希望使用任何登录详细信息。我知道它通常与应用程序池和 IIS 有关,但除了尝试和更改一些次要选项和功能之外,我似乎找不到可行的解决方案。

编辑: 这是我要执行的代码:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DOMAINANME"))
{
    GroupPrincipal group = new GroupPrincipal.FindByIdentity(pc, "GROUPNAME");
    group.Members.Remove(pc, IdentityType.SamAccountName, "USERNAME");
    group.Save();
}

【问题讨论】:

  • 我认为您必须使用某种登录详细信息。否则,asp.net 将在应用程序池的安全上下文中运行,该应用程序池默认具有非常低的权限(应该如此)。我认为您可以通过使用活动目录作为您的会员提供者来做到这一点。
  • @sovemp 我该怎么做?我似乎找不到正确的提供者。
  • 如果您将身份验证模式设置为 windows(并授权拒绝所有未经身份验证的用户),这将强制浏览器请求 AD 登录。编辑:另外,如果您不想提示登录,我同意 Zychia 的建议,即创建一个仅限 Intranet 的层。
  • @sovemp 我拒绝了所有匿名用户,但仍然 - 当我应用 .save() 方法时没有提示 AD 登录。有什么想法吗?
  • 您是在本地计算机上进行的吗?我认为,在您将其部署在域中的某个位置之前,它实际上不会提示。

标签: c# asp.net active-directory windows-authentication


【解决方案1】:

您的直觉是正确的 - 您需要对应用程序池帐户具有适当的权限。

最简单的方法是:

  1. 创建一个新的域用户帐户
  2. 将其添加到“域管理员”组
  3. 在您的 iis 服务器中,找到您的应用程序使用的池并将池标识更改为新创建的用户

这样,从用户到 iis 的所有请求都在域管理员的上下文中运行,因此从 iis 到 AD 的所有请求都会成功 - 域管理员可以操作 AD。

虽然上述解决方案可行,但可能不推荐。这是因为应用程序除了连接到 AD 之外还有很多事情要做,如果有可能被滥用的地方,您可能会在域管理上下文中运行不需要的请求。

通常,这样的应用程序会有两个层,一个前层和一个后层。前端层在受限上下文中运行,负责所有用户请求。这是您的应用程序。底层是另一个网络应用程序,不能从 Internet 访问,只能从本地 Intranet 访问。此应用程序在域管理上下文中运行,并用作 AD 的网关。前端应用程序使用后端应用程序与 AD 对话。

【讨论】:

  • 我的主要问题是我不允许创建登录用户。但是,我可以要求用户输入他的 Windows 登录详细信息并使用它。可悲的是,我不知道如何解决这个问题。
  • 如果您将域管理员帐户设置为池身份,那么创建新用户不起作用?听起来几乎不可能,或者您还有另一个不相关的问题。
【解决方案2】:

要执行需要特定 Active Directory 权限的代码,请执行以下步骤:

  1. 要求用户登录到 ASP.NET 应用程序。
  2. 在执行需要访问的 Active Directory 部分时,让您的代码模拟当前登录的用户。

根据您使用的 ASP.NET 版本,可能会略有不同,但基本上...

步骤 1

对于用户登录,只需使用标准的 ASP.NET 身份验证配置。因为它是最容易配置的(并且只适用于 AD),所以我将在此处记录 Windows 身份验证。这将通过标准 Windows 登录对话框提示用户 - 他们需要在其中输入其域凭据。要配置应用程序,请对 Web.config 进行以下更改

<configuration>
  ...
  <system.web>
    ...
    <authentication mode="Windows" />
    ...
  </system.web>
  ...
</configuration>

默认情况下,当为 Windows 身份验证配置时,ASP.NET 应该已经知道如何与 Active Directory 通信,因此不需要其他任何东西,但是如果您发现需要单独的角色提供程序,随意采取the one we use。 (我们也有instructions。)但同样,你不应该需要它。

编辑:您还需要确保 IIS 已配置 - 使用 inetmgr.exe - 不允许匿名访问应用程序。否则,它永远不会提示用户登录。我们通常禁用 匿名 访问并启用 Windows基本 身份验证 - 因为我们需要支持不支持 NTLM 的浏览器。

第二步

现在您有一个经过身份验证的用户,您可以通过编程方式模拟他们。以下内容改编自Impersonating the authenticating user in code

System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();

try
{
    // Do your writing to the AD here
}
finally
{
    impersonationContext.Undo();
}

我也刚刚发现(在搜索此答案的参考链接时)这在 MSDN 文章 How To: Use Windows Authentication in ASP.NET 2.0 中都有很好的记录

让我们知道进展如何:-)

【讨论】:

  • 当我将尝试执行的代码(主帖)放在您的 /try/ 块之间时出现下一个错误:发生操作错误。它还将我的代码的第一行(GroupPrincipal 组..)标记为导致问题的原因。
  • @TommyNaidich 与 Active Directory 通信的错误确实很难排除故障。我首先要验证 1) 在 try 块内运行的代码正在按照您期望的用户执行。如果您可以调试运行中的代码,请检查impersonationContext 的值。 (我现在不在可以验证这一点的计算机上,但它里面应该有一些属性可以让你看到用户名等)并且,2)确保你模拟的用户具有权限需要。您可以发布确切错误的副本吗?
  • 我还建议只模拟实际需要它的代码 - 所以只需将 group.Save() 调用包装在 try 块中。这个想法是将提升的权限保持在最低限度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多