Веб-сервис не может записывать в журнал событий при вызове анонимным пользователем

2

РЕЗЮМЕ: Как настроить веб-службу так, чтобы запись в журнал событий всегда была возможна (независимо от вызывающего)? ДЕТАЛИ: У меня есть веб-служба, которая записывает запись в журнал приложений. Я установил источник события для этого с помощью небольшого консольного приложения, и я думаю, что понимаю эту часть вещей. Когда я тестирую этот WS, я вижу, что успешно записываю свою запись в журнал событий.

Виртуальный каталог, в котором размещен этот WS, НЕ разрешает анонимный доступ и настроен только для встроенного Windows Auth.

У меня есть веб-клиентское приложение, которое вызывает этот Web-сервис. Когда сайт веб-клиента настроен только для встроенного Windows Auth, вызовы в Webservice приводят к регистрации в случае необходимости.

Тем не менее, если я изменяю сайт веб-клиента, чтобы разрешить анонимный доступ, то попытка Webservice регистрировать результаты в InvalidOperationException. Я игнорирую его, но было бы неплохо узнать, как войти в веб-сервис, независимо от того, как он называется. Вот немного моего кода:

   public FileService()
    {
        try
        {
            if (!EventLog.SourceExists(g_EventSource))
                EventLog.CreateEventSource(g_EventSource, g_EventLog);

            System.Security.Principal.WindowsIdentity UserIdentityInfo;
            UserIdentityInfo = System.Security.Principal.WindowsIdentity.GetCurrent();
            string AuthType = UserIdentityInfo.AuthenticationType;

    if (AuthType == "Kerberos")
    { engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials; }
    else
    { engineWSE.Credentials = new System.Net.NetworkCredential("u", "p", "domain"); }

    EventLog.WriteEntry(g_EventSource,
                "Caller: " + UserIdentityInfo.Name +
                " AuthType: " + UserIdentityInfo.AuthenticationType,
                EventLogEntryType.Information, 1);
        }
        catch (InvalidOperationException e)
        {
            // do nothing to ignore: "Cannot open log for source 'myAppSourceName'. You may not have write access." 
        }
    }

Пример в вышеприведенном конструкторе для нас как-то ухищрен (я в основном заинтересован в возможности выписывать информацию, связанную с ошибками в веб-службе).

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

Теги:
visual-studio
logging
web-services

2 ответа

2
Лучший ответ

Вы также должны проверить свой web.config.

Если IIS настроен на анонимность, а для web.config установлено значение windows/impersonate. Тогда это будет анонимный пользователь IIS, который пытается записать в журнал событий.

  • 0
    Благодарю. Я перечитал мой вопрос внимательно в соответствии с вашим ответом. У меня действительно есть <identity impersonate = "true" /> и <authentication mode = "Windows" /> в web.config веб-сайта, на котором размещен мой веб-сервис. Я нуждаюсь в этом, потому что мне нужна идентификация веб-клиента INTRAnet (см., Как я проверяю тип аутентификации и соответственно передаю учетные данные). Итак, вы говорите, что из-за «олицетворения» в web.config он ведет себя так, как будто я проверил «Анонимный доступ» для моего сайта веб-сервиса? Я думаю, ты скажешь да. Учитывая мои цели, есть ли способ настроить это для регистрации в любом случае?
  • 0
    Необходимо предоставить анонимному пользователю IIS право записи в журнал событий. Это имя IUSR ....
Показать ещё 3 комментария
3

Служба сети разрешена для записи в журнал событий, но не создает источник события. вы можете предоставить разрешения для HKLM\SYSTEM\CurrentControlSet\Services\Eventlog\, чтобы позволить ему создавать, но если вы уже создали его во время установки, нет необходимости.

Возможно, он также не работает в SourceExists, поскольку для этого требуется перечислить один и тот же раздел реестра. Возможно, я просто удалю проверку SourceExists/Create и верю, что она там - если вы анонимны, вы все равно не сможете ее создать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню