Как передать учетные данные HostingEnvironment.Impersonate в ExchangeService EWS? - PullRequest
3 голосов
/ 05 марта 2012

Можно ли передать учетные данные пользователя, просматривающего мое веб-приложение asp.net, на вызов EWS FindAppointments?

Я только пытаюсь вернуть детали календаря для активного пользователя, который, без сомнения, будет иметь разрешение на чтение своего собственного календаря, поэтому проблема не должна касаться олицетворения Exchange с API EWS , обсуждаемым здесь .

Приведенный ниже код прекрасно работает при запуске localhost, но работает с веб-сервера, несмотря на то, что Windows Authentication и Identity Impersonation настроены, он выдает ошибку отказа в доступе.

using (HostingEnvironment.Impersonate())
    {
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

    service.UseDefaultCredentials = true;
    service.AutodiscoverUrl(UserEmailAddress);

    Mailbox mb = new Mailbox(UserEmailAddress);
    FolderId cfCalendarFolderID = new FolderId(WellKnownFolderName.Calendar, mb);
    CalendarView cvCalendarView = new CalendarView(DateTime.Now, DateTime.Now.AddDays(30), 1000);
    cvCalendarView.MaxItemsReturned = 3;

Возможно, мне не хватает простого способа передачи учетных данных HostingEnvironment в мой ExchangeService объект?

Есть ли способ проверить, что такое service.UseDefaultCredentials?

Я не могу использовать следующее, так как нет способа получить пароль от пользователя, прошедшего аутентификацию в Windows.

service.Credentials = new System.Net.NetworkCredential(username, password, domain);

Я также попробовал следующее, но получаю ту же ошибку при отказе в доступе ServiceResponseException.

service.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
service.PreAuthenticate = true;

Заранее благодарим за помощь.

Дополнительная информация, которая может иметь или не иметь отношение к делу:

  • Пул приложений для веб-сайта: NetworkService.
  • Переменная UserEmailAddress устанавливается из поиска AD на основе System.Security.Principal.WindowsIdentity.GetCurrent().Name

РЕДАКТИРОВАТЬ (14 августа 2012 г.) Для достижения того, что я хотел бы сделать выше, я считаю, что HostingEnvironment.Impersonate не требуется. Вместо этого мне нужно использовать свойство ExchangeService ImpersonatedUserId. Подробнее об этом здесь Единственная проблема, однако, заключается в том, что мы запускаем Exchange 2007, и команда power shell для включения учетной записи службы для олицетворения всех пользователей (которую вы бы использовали, передавая параметр .Credentials) только кажется совместимой с Exchange 2010.

1 Ответ

0 голосов
/ 06 марта 2012

Вы должны попробовать использовать WebCredentials вместо NetworkCredential - см. связанный SO сообщение . Кажется, есть проблема с EWS и AutoDiscover + NetworkCredentials

...