我收到一个基于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)
代码在我们的开发域中运行良好,但在我们的生产域中没有。任何人都可以协助帮助解决这个问题吗?
答案 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问题?
这就是为什么我认为这可能是一个问题:
或者至少在我的经历中,这是问题的10倍。
答案 2 :(得分:0)
我想问题是它适用于开发环境,因为当你在那里启动webapp时,你可以使用你的个人帐户运行它,该帐户可能有权写入AD。
在生产环境中,您必须确保运行Web应用程序(网络服务帐户)的进程还具有更新AD的权限。这听起来像是因为我曾经有类似的问题。
答案 3 :(得分:0)
问题不在于代码,而是在域上如何设置服务器。由于某种原因,网络管理员未在活动目录中选择“信任计算机用于委派”选项。
令人高兴的是,问题不是“双跳”问题:)