Подключение к серверу Exchange с использованием современной аутентификации
Современная аутентификация теперь включена по умолчанию для всех новых клиентов Microsoft 365/Azure, поскольку этот протокол более безопасен, чем устаревшая базовая аутентификация. Современная аутентификация основана на библиотеке аутентификации Active Directory и OAuth 2.0. Она использует токены, ограниченные по времени, а приложения не хранят учетные данные пользователей.
Предварительные настройки
Чтобы использовать современную аутентификацию, убедитесь, что она включена. Однако для арендаторов, созданных до 1 августа 2017 года, современная аутентификация по умолчанию отключена. В Центр администрирования Microsoft 365, иди Настройки > Организационные настройки > Современная аутентификация. В Современное всплывающее окно аутентификации на экране появляется возможность определить протоколы, для которых больше не требуется обычная аутентификация. Для новых клиентов Microsoft365 в Azure базовая аутентификация по умолчанию отключена для всех приложений. Поэтому текст будет отображаться в этом разделе.
В вашей организации включены настройки безопасности по умолчанию, что означает, что требуется современная аутентификация в Exchange Online, а подключения к базовой аутентификации заблокированы. Вы должны отключить настройки безопасности по умолчанию на портале Azure, прежде чем изменять какие-либо настройки здесь.
Вы можете включить поддержку Basic Auth для арендатора из Azure портал, вперед Azure Active Directory > Свойства > Управление настройками безопасности по умолчанию > Включить настройки безопасности по умолчанию > Нет. Для получения дополнительной информации см. Статья в документации Microsoft.
Регистрация приложения в Azure Active Directory
Необходимо выполнить регистрацию приложения в Azure Active Directory. Существует два типа разрешений, которые можно использовать для доступа к почтовым ящикам с помощью приложения. Выберите определенный тип разрешения в зависимости от создаваемого приложения:
- Приложения, использующие Делегированные разрешения пригласите зарегистрированного пользователя. Другими словами, когда вы подключаетесь к сервису, появляется диалоговое окно с именем пользователя и паролем. Приложение никогда не может иметь больше привилегий, чем авторизованный пользователь.
- Приложения, использующие Разрешения для приложений запускается без присутствия зарегистрированного пользователя. Например, это приложения, которые работают в фоновом режиме или в качестве демонов. Только администратор может дать согласие на получение разрешений для приложений.
Кроме того, см. Статья в документации Microsoft для получения дополнительной информации.
Процедура регистрации зависит от типа выбранного разрешения. Чтобы зарегистрировать приложение, обратитесь к Статья в документации Microsoft.
Используйте современную аутентификацию с EWSClient
После регистрации приложения мы можем сосредоточиться на написании кода, который будет состоять из следующих частей:
- Получите токен авторизации.
- Используйте токен для аутентификации.
Получение токена авторизации
Чтобы получить токен, мы будем использовать Библиотека аутентификации Microsoft (MSAL) для .NET.
Ниже приведены шаги для получения токена авторизации.
- Добавьте Пакет microsoft.Identity.Client nuget который содержит двоичные файлы MSAL.NET.
- Создайте класс AccessParameters для хранения учетных данных.
- Создайте метод, принимающий параметры доступа и использующий MSAL.NET для получения токена доступа.
Следующие примеры кода будут зависеть от выбранного типа аутентификации.
Получите токен с делегированной аутентификацией
public class AccessParameters
{
public string TenantId { get; set; }
public string ClientId { get; set; }
public string RedirectUri { get; set; } = "http://localhost";
public string[] Scopes { get; set; } = { "https://outlook.office365.com/EWS.AccessAsUser.All" };
}
public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
var pca = PublicClientApplicationBuilder
.Create(accessParameters.ClientId)
.WithTenantId(accessParameters.TenantId)
.WithRedirectUri(ccessParameters.RedirectUri)
.Build();
var result = await pca.AcquireTokenInteractive(accessParameters.Scopes)
.WithUseEmbeddedWebView(false)
.ExecuteAsync();
return result.AccessToken;
}
Получите токен с помощью аутентификации приложения
public class AccessParameters
{
public string TenantId { get; set; }
public string ClientId { get; set; }
public string ClientSecret { get; set; }
public string[] Scopes { get; set; } = { "https://outlook.office365.com/.default" };
}
public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
var cca = ConfidentialClientApplicationBuilder
.Create(accessParameters.ClientId)
.WithClientSecret(accessParameters.ClientSecret)
.WithTenantId(accessParameters.TenantId)
.Build();
var result = await cca.AcquireTokenForClient(accessParameters.Scopes).ExecuteAsync();
return result.AccessToken;
}
Использование токена для аутентификации
После этого, когда мы успешно получим токен, давайте инициализируем EwsClient.
Использование токена с делегированной аутентификацией
NetworkCredential credentials = new OAuthNetworkCredential(accessToken);
using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);
Использование токена с аутентификацией приложения
// Use Microsoft365 username and access token
NetworkCredential credentials = new OAuthNetworkCredential(username, accessToken);
using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);
Используйте современную аутентификацию с клиентами IMAP, POP или SMTP
Доступ по протоколам IMAP, POP, SMTP через разрешения приложений не поддерживается. Другими словами, поддерживается только делегированная аутентификация.
Определена процедура регистрации приложения в Azure Active Directory above.
Используйте Центр администрирования Microsoft 365, чтобы включить или отключить IMAP, POP, SMTP AUTH в определенных почтовых ящиках
- Откройте Центр администрирования Microsoft 365 и перейдите к Пользователи > Активные пользователи.
- Выберите пользователя и в появившемся всплывающем окне нажмите Mail.
- В Приложения для электронной почты раздел, нажмите Управление почтовыми приложениями.
- Проверьте IMAP, POP, аутентифицированный SMTP настройка: не отмечена = выключена, отмечена = включена.
- Click Сохранить изменения.
Добавление кода для получения токена аутентификации с сервера токенов
Обязательно укажите полные области, включая URL-адреса ресурсов Outlook.
IMAP: https://outlook.office.com/IMAP.AccessAsUser.All ПОП-МУЗЫКА: https://outlook.office.com/POP.AccessAsUser.All SMTP: https://outlook.office.com/SMTP.Send
Чтобы получить токен, мы будем использовать Библиотека аутентификации Microsoft (MSAL) для .NET.
Ниже приведены шаги для получения токена авторизации.
- Добавьте Пакет microsoft.Identity.Client nuget который содержит двоичные файлы MSAL.NET.
- Создайте класс AccessParameters для хранения учетных данных.
- Создайте метод, принимающий параметры доступа и использующий MSAL.NET для получения токена доступа.
public class AccessParameters
{
public string TenantId { get; set; }
public string ClientId { get; set; }
public string RedirectUri { get; set; } = "http://localhost";
public string[] Scopes { get; set; } = {
"https://outlook.office.com/IMAP.AccessAsUser.All",
"https://outlook.office.com/SMTP.Send" };
}
public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
var pca = PublicClientApplicationBuilder
.Create(accessParameters.ClientId)
.WithTenantId(accessParameters.TenantId)
.WithRedirectUri(ccessParameters.RedirectUri)
.Build();
var result = await pca.AcquireTokenInteractive(accessParameters.Scopes)
.WithUseEmbeddedWebView(false)
.ExecuteAsync();
return result.AccessToken;
}
Использование токена для аутентификации
После этого, когда мы успешно получим токен, давайте инициализируем ImapClient.
var imapClient = new ImapClient(
"outlook.office365.com",
993,
username,
accessToken,
true);
Аналогичным образом, SmtpClient инициализация будет выглядеть следующим образом.
var smtpClient = new SmtpClient(
"smtp.office365.com",
587,
username,
accessToken,
true);
Верните идентификатор запроса клиента
The ReturnClientRequestId Для вашего удобства в EWSClient было добавлено свойство, позволяющее указать, следует ли возвращать идентификатор запроса клиента в ответе на вызовы Exchange Web Services (EWS). Идентификатор запроса клиента — это уникальный идентификатор, который можно задать для каждого запроса EWS, отправляемого из приложения. Настроив ReturnClientRequestId недвижимость для true, вы указываете, что хотите включить идентификатор запроса клиента в ответ сервера EWS. Это может быть полезно для отслеживания и сопоставления запросов и ответов в сценариях, где несколько запросов подаются и обрабатываются асинхронно.
В следующем фрагменте кода показано, как можно использовать это свойство:
using (IEWSClient client = TestUtil.CreateEWSClient(user))
{
// Client will create random id and pass it to the server.
// The server should include this id in request-id header of all responses.
client.ReturnClientRequestId = true;
client.LogFileName = "ews.log";
client.GetMailboxInfo();
}