从Web应用程序错误更新Active Directory

时间:2009-06-17 04:31:33

标签: c# asp.net security active-directory

我收到一个基于Web的应用程序的错误,该应用程序允许企业内部网用户更新其活动目录详细信息(电话号码等)。

Web应用程序托管在运行Windows Server 2003(SP1)的IIS6上。 IIS网站正在使用NTLM身份验证,该网站已启用集成安全性。 IIS应用程序池使用“网络服务”帐户运行。

web.config包含以下元素

<LdapConfigurations server="xxx.internal" root="OU=Staff Accounts,DC=xxx,DC=internal" domain="xxx" />
<identify impersonate=”true” />

不需要Active Directory委派,因为以下C#(.NET 3.5)代码应将正确的模拟详细信息(包括安全令牌)传递到Active Directory。

public void UpdateData(string bus, string bus2, string fax, string home, string home2, string mob, string pager, string notes)
{
    WindowsIdentity windId = (WindowsIdentity)HttpContext.Current.User.Identity;
    WindowsImpersonationContext ctx = null;

    try
    {
        ctx = windId.Impersonate();

        DirectorySearcher ds = new DirectorySearcher();
        DirectoryEntry de = new DirectoryEntry();

        ds.Filter = m_LdapUserFilter;

        // i think this is the line causing the error
        de.Path = ds.FindOne().Path;

        this.AssignPropertyValue(bus, ADProperties.Business, ref de);
        this.AssignPropertyValue(bus2, ADProperties.Business2, ref de);
        this.AssignPropertyValue(fax, ADProperties.Fax, ref de);
        this.AssignPropertyValue(home, ADProperties.Home, ref de);
        this.AssignPropertyValue(home2, ADProperties.Home2, ref de);
        this.AssignPropertyValue(mob, ADProperties.Mobile, ref de);
        this.AssignPropertyValue(pager, ADProperties.Pager, ref de);
        this.AssignPropertyValue(notes, ADProperties.Notes, ref de);

        // this may also be causing the error?
        de.CommitChanges();
    }
    finally
    {
        if (ctx != null) 
        {
            ctx.Undo();
        }
    }
}

private void AssignPropertyValue(string number, string propertyName, ref  DirectoryEntry de)
{
    if (number.Length == 0 && de.Properties[propertyName].Value != null)
    {
        de.Properties[propertyName].Remove(de.Properties[propertyName].Value);
    }
    else if (number.Length != 0)
    {
        de.Properties[propertyName].Value = number;
    }
}

可以从Active Directory检索用户详细信息而不会出现问题,但在更新用户AD详细信息时会出现问题。将显示以下异常消息。

 System.Runtime.InteropServices.COMException (0x80072020): An operations error occurred. 
       at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
       at System.DirectoryServices.DirectoryEntry.Bind() 
       at System.DirectoryServices.DirectoryEntry.get_AdsObject() 
       at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne) 
       at System.DirectoryServices.DirectorySearcher.FindOne()    
       at xxx.UpdateData(String bus, String bus2, String fax, String home, String home2, String mob, String pager, String notes) 
       at xxx._Default.btnUpdate_Click(Object sender, EventArgs e)

代码在我们的开发域中运行良好,但在我们的生产域中没有。任何人都可以协助帮助解决这个问题吗?

4 个答案:

答案 0 :(得分:0)

这很可能是一个权限问题 - 这里有很多关于模仿和委派及其变幻莫测的文章:http://support.microsoft.com/default.aspx?scid=kb;en-us;329986和此处:http://support.microsoft.com/default.aspx?scid=kb;en-us;810572

答案 1 :(得分:0)

听起来您可能有重复的SPN问题?

这就是为什么我认为这可能是一个问题:

  1. 它适用于您的开发环境(假设它也使用网络服务,并且在同一个域中)
  2. 您已在网络配置中模仿。
  3. 当存在重复的SPN时,它会使安全令牌无效,因此即使您已在代码中正确创建它,AD也不会“信任”该服务器进行模拟,因此接收请求的服务器会对其进行更改AD(在您的DC上)收到请求但随后丢弃它,因为AD中的机器帐户或SPN问题(重复或错误的机器名称/域名)上没有应用分层权限
  4. 或者至少在我的经历中,这是问题的10倍。

答案 2 :(得分:0)

我想问题是它适用于开发环境,因为当你在那里启动webapp时,你可以使用你的个人帐户运行它,该帐户可能有权写入AD。

在生产环境中,您必须确保运行Web应用程序(网络服务帐户)的进程还具有更新AD的权限。这听起来像是因为我曾经有类似的问题。

答案 3 :(得分:0)

问题不在于代码,而是在域上如何设置服务器。由于某种原因,网络管理员未在活动目录中选择“信任计算机用于委派”选项。

令人高兴的是,问题不是“双跳”问题:)