401 Несанкционированный при попытке отправить электронную почту из EWS Managed API - PullRequest
0 голосов
/ 20 декабря 2018

Хорошо, поэтому я разрабатываю надстройку, которая должна автоматически отправлять электронные письма другим.Я знаю, что у office-js нет прав для этого, и я начал использовать EWS Managed API.Я внедрил токен SSO и получаю его с помощью:

Office.context.auth.getAccessTokenAsync()

После получения токена я выполняю запрос на мой сервер, на котором у меня есть управляемый API EWS, и пытаюсь отправить электронное письмо с следующим кодом:

ExchangeService exService = new ExchangeService();
exService.Url = new Uri(ewsUrl);
ExchangeCredentials credentials = new OAuthCredentials(ssoToken);
exService.Credentials = credentials;
EmailMessage emailMessage = new EmailMessage(exService);

Когда я звоню emailMessage.SendAndSaveCopy();, выдается 401 Ошибка.

Если я использую WebCredentials(user, pass) вместо OAuthCredentials(ssoToken), это сработает.Я не понимаю, почему (я также установил разрешения на портале Azure)

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вы также должны установить для свойства ExchangeServer.ImpersonatedUserId адрес пользователя, от имени которого вы отправляете.

0 голосов
/ 20 декабря 2018

Конвергентные приложения против старых регистраций

Приложение SSO (единый вход), которое вам нужно было создать, нужно было создать с помощью https://apps.dev.microsoft.com. Именно здесь вы и создали конвергентные приложения - что позволяет сторонам, имеющим согласие, войти в систему с использованием своих учетных записей Outlook.com или учетных записей организации (что является более новым способом).

Однако EWS не использует это.EWS использует метод аутентификации более старого способа создания приложений, что необходимо сделать через портал Azure - через регистрации приложений AAD.Дополнительная документация по аутентификации EWS здесь: https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/authentication-and-ews-in-exchange

Таким образом, полученный токен доступа OAuth, который вы получили, можно использовать для запроса к Microsoft Graph (в качестве примера), но вы не можете использовать его для вызоваEWS.

Одно очень существенное отличие, которое это создает, заключается в том, что EWS (как следует из названия, веб-службы Exchange) - это только учетные записи организации.Вы не можете использовать этот API для пользователей Outlook.com.

  • Если вы используете SSO Framework, вы заблокированы для нового способа регистрации приложений.Вы можете аутентифицировать пользователей из Outlook.com / или учетных записей организации.Вы можете получить доступ к Microsoft Graph и другим подобным источникам, но не к EWS.
  • Если вы хотите использовать EWS - вы не можете аутентифицировать пользователей Outlook.com.И вы не можете получить токен, который вы можете вызвать EWS через SSO.

Решения

  • С полученным токеном доступа (если вы запрашиваете правильные области)вы все еще можете отправлять почту - и ваше решение будет работать с пользователями Outlook.com.Проверьте Graph API: https://docs.microsoft.com/en-us/graph/api/resources/mail-api-overview?view=graph-rest-1.0
  • Если вы настаиваете на использовании EWS, вы можете прекратить вызов токена доступа и использовать метод makeEwsRequestAsync.Это потребует от вас написания SOAP в javascript, но это работает.
  • Если вам не нравится идея SOAP в JS (которую я полностью понимаю) и вы все еще хотите использовать EWS через код C #, вы должны отказаться от использованияРамки единого входа.Вместо этого аутентифицируйте пользователя через Dialog API, используя OAuth, против регистрации вашего приложения AAD (не конвергентная модель, а регистрация через портал Azure)
...