Интеграция 1С с Microsoft Exchange через Exchange Web Services (EWS) — это мощный инструмент для автоматизации работы с почтой, календарями и задачами. Однако разработчики часто сталкиваются с ситуацией, когда авторизация ведет себя непредсказуемо. Например, запрос к серверу может успешно выполняться даже при указании заведомо неверного пароля в коде. Разберем подробно, почему так происходит, как на самом деле работает проверка подлинности и как правильно организовать доступ к данным разных пользователей.
При использовании COM-объекта MSXML2.XMLHTTP или WinHttp.WinHttpRequest.5.1 для отправки SOAP-запросов к Exchange, многие сталкиваются с тем, что параметры логина и пароля в методе open() игнорируются. Проанализируем причину этого поведения.
Большинство корпоративных серверов Exchange настроены на использование Windows Integrated Authentication (NTLM или Kerberos). Если компьютер, на котором запущена 1С, находится в том же домене, что и сервер Exchange, библиотека MSXML2.XMLHTTP может автоматически использовать учетные данные текущего сеанса Windows. Рассмотрим пошагово, что происходит:
/EWS/Exchange.asmx.В результате, какие бы учетные данные вы ни писали в методе open(), запрос выполняется от имени того, под кем запущен сеанс 1С или служба сервера 1С. Это объясняет, почему для «новых» доменных учеток всё работает «само», а для внешних или старых учеток авторизация может требовать явного указания пароля.
Посмотрим на пример функции, которая создает объект для отправки запроса. Важно понимать, что метод open подготавливает соединение, но не гарантирует, что будут использованы именно эти Логин и Пароль, если включена сквозная авторизация.
Функция СоздатьXMLHTTP(ИмяСервера, Логин, Пароль)
стрURL = "https://" + ИмяСервера + "/EWS/Exchange.asmx";
oXMLHTTP = Новый COMОбъект("MSXML2.XMLHTTP");
// Третий параметр "Ложь" означает синхронный запрос
oXMLHTTP.open("POST", стрURL, Ложь, Логин, Пароль);
oXMLHTTP.setRequestHeader("Content-Type", "text/xml;charset=UTF-8");
Возврат oXMLHTTP;
КонецФункции
Выясним, как Exchange понимает, чьи именно папки нужно вернуть. В EWS за это отвечает структура XML-запроса в теле SOAP-сообщения. Если мы используем стандартные константы, такие как msgfolderroot (корень почтового ящика) или inbox (входящие), сервер всегда возвращает данные того пользователя, под которым прошла авторизация.
Проанализируем пример SOAP-пакета для поиска папок:
| <m:ParentFolderIds>
| <t:DistinguishedFolderId Id="msgfolderroot"/>
| </m:ParentFolderIds>
Если вы авторизованы как Иванов, вы увидите папки Иванова. Если как Петров — папки Петрова. Но как быть, если нам нужно одной сервисной учетной записью собирать почту со всех ящиков компании? Здесь на сцену выходит механизм Application Impersonation (Олицетворение).
Для массовой обработки писем без знания паролей каждого пользователя используется механизм «самозванства». Рассмотрим, как это реализовать:
ApplicationImpersonation. Это делается через Exchange Management Shell командой New-ManagementRoleAssignment.Header) необходимо добавить блок ExchangeImpersonation.Разберем, как должен выглядеть заголовок в коде 1С, чтобы сервер понял, что мы хотим «прикинуться» другим пользователем:
Функция СформироватьЗаголовокИмперсонации(EmailЦелевогоПользователя)
ТекстЗаголовка =
"<soap:Header>
| <t:ExchangeImpersonation>
| <t:ConnectingSID>
| <t:PrimarySmtpAddress>" + EmailЦелевогоПользователя + "</t:PrimarySmtpAddress>
| </t:ConnectingSID>
| </t:ExchangeImpersonation>
|</soap:Header>";
Возврат ТекстЗаголовка;
КонецФункции
Теперь, даже если ваша сессия авторизована под пользователем ServiceAccount, наличие этого заголовка заставит Exchange выполнять операции в контексте ящика EmailЦелевогоПользователя.
При работе с Exchange 2013 стоит помнить о нескольких важных моментах:
Authorization: Basic [Base64(login:pass)].MSXML2.XMLHTTP нужно передавать Bearer-токен в заголовках.Чтобы окончательно разобраться, под каким пользователем идет запрос и почему он проходит, рекомендуем использовать следующие инструменты:
Authorization. Вы увидите, идет там NTLM, Negotiate или Basic./EWS/Exchange.asmx.Таким образом, для стабильной работы интеграции следует не полагаться на автоматическую авторизацию Windows, а четко настраивать права ApplicationImpersonation и явно управлять заголовками запроса. Это позволит вашей обработке 1С работать с любыми почтовыми ящиками централизованно и безопасно.