Обновление Active Directory из-за ошибки веб-приложения - PullRequest
0 голосов
/ 17 июня 2009

Я получаю сообщение об ошибке веб-приложения, которое позволяет пользователям корпоративной интрасети обновлять данные своего активного каталога (номера телефонов и т. Д.).

Веб-приложение размещено на IIS6 под управлением Windows Server 2003 (SP1). На веб-сайте 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 голосов
/ 05 августа 2009

Проблема была не в коде, а в том, как был настроен сервер в домене. По какой-то причине администратор сети не выбрал параметр «Доверенный компьютер для делегирования» в активном каталоге.

К счастью, проблема была не в "двойном хопе":)

0 голосов
/ 17 июня 2009

Похоже, у вас может быть повторяющаяся проблема с SPN?

Вот почему я думаю, что это может быть проблемой:

  1. Он работает в вашей среде разработчика (при условии, что он также использует сетевой сервис и в том же домене)
  2. В вашем веб-конфиге вы олицетворены.
  3. При наличии дублированного имени участника-службы он делает недействительным токен безопасности, поэтому, даже если вы правильно его создали в коде, AD не «доверяет» этому серверу для олицетворения, поэтому сервер, получивший запрос на изменение AD (на одном из ваших контроллеров домена) получает запрос, но затем отклоняет его, потому что разрешение на рассылку не было применено к учетной записи компьютера в AD, или проблема SPN (либо дублирование, либо неправильное имя компьютера / имя домена)

Или, по крайней мере, в моем опыте, проблема в 9 из 10 раз больше.

0 голосов
/ 17 июня 2009

Думаю, проблема в том, что он работает в среде разработки, потому что, когда вы запускаете там свое веб-приложение, вы запускаете его со своей личной учетной записью, которая, вероятно, имеет права на запись в AD.

В производственной среде вы должны убедиться, что процесс, выполняющий ваше веб-приложение (учетная запись сетевой службы), также имеет права на обновление AD. Мне кажется, это может быть проблемой, так как однажды у меня была похожая проблема.

0 голосов
/ 17 июня 2009

Скорее всего, это проблема с разрешениями - здесь есть множество статей, касающихся олицетворения и делегирования, а также их причуд: http://support.microsoft.com/default.aspx?scid=kb;en-us;329986 и здесь: http://support.microsoft.com/default.aspx?scid=kb;en-us;810572.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...