MailKit, Office 365 и OAUTH2: проблема с аутентификацией серверного приложенияC#

Место общения программистов C#
Ответить
Anonymous
 MailKit, Office 365 и OAUTH2: проблема с аутентификацией серверного приложения

Сообщение Anonymous »

Мне нужно создать консольное приложение .Net, которое запускается на стороне сервера в пакетном режиме и отправляет электронную почту получателям с помощью Office365 и MailKit.
Наша компания недавно внедрила многофакторную аутентификацию; Я уже переписал интерактивное приложение, которое позволяет пользователю отправлять электронную почту с помощью MailKit и MFA, но я не могу реализовать ту же функциональность в автоматическом приложении.
Я уже зарегистрировал приложение в Microsoft Azure, создал секрет клиента и реализовал следующий класс:
public class Mailer {
public async static void Send(string subject, string body) {
string tenantID = "abcdef";
string clientId = "ghilmn";
string clientSecret = "opqrst";
string appName = "MyApp";

//clientSecret = Uri.EscapeDataString(clientSecret);
//clientSecret = Uri.EscapeUriString(clientSecret);

var MyConfidentialClientApplication = ConfidentialClientApplicationBuilder.Create(clientId)
.WithClientSecret(clientSecret)
.WithTenantId(tenantID)
.Build();

var scopes = new string[] {"https://graph.microsoft.com/.default"};

try {
var authToken = await MyConfidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync();

var oauth2 = new SaslMechanismOAuth2(appName, authToken.AccessToken); // SaslMechanismOAuth2(appName, authToken.AccessToken);
var m_client = new SmtpClient(new ProtocolLogger("smtp.log"));
await m_client.ConnectAsync("outlook.office365.com", 587, SecureSocketOptions.StartTls);
await m_client.AuthenticateAsync(oauth2);
}
catch (Exception ex) {
Debug.WriteLine(ex.Message);
// do nothing;
}
return;

}

Хотя токен кажется правильно полученным (authToken.AccessToken не равен нулю),

await m_client.AuthenticateAsync(oauth2);

сгенерирует следующую ошибку:
Eccezione generata: 'MailKit.Security.AuthenticationException' in System.Private.CoreLib.dll
535: 5.7.3 Authentication unsuccessful [ZR0P278CA0036.CHEP278.PROD.OUTLOOK.COM]

По сути, я не понимаю
  • если SaslMechanismOAuth2 является правильным для вызова
  • если да, то какое имя пользователя я должен передать конструктору oauth2; я пробовал использовать AppName, AppID и даже электронную почту пользователя, но безуспешно.
Любая подсказка будет оценена, заранее спасибо.
Паоло
P.S. интерактивное приложение, которое работает, использует вызовы PublicClientApplicationBuilder и AcquireTokenInteractive, используя следующий код.
public async Task Connect_MFA() {

var options = new PublicClientApplicationOptions {
ClientId = "abcd",
TenantId = "efgh",
RedirectUri = "https://login.microsoftonline.com/commo ... tiveclient"
};

var publicClientApplication = PublicClientApplicationBuilder
.CreateWithApplicationOptions(options)
.Build();

var scopes = new string[] {
"email",
"offline_access",
//"https://outlook.office.com/IMAP.AccessAsUser.All", // Only needed for IMAP
//"https://outlook.office.com/POP.AccessAsUser.All", // Only needed for POP
"https://outlook.office.com/SMTP.Send", // Only needed for SMTP
};

var authToken = await publicClientApplication.AcquireTokenInteractive(scopes).ExecuteAsync();

var oauth2 = new SaslMechanismOAuth2(authToken.Account.Username, authToken.AccessToken);

m_client = new SmtpClient(new ProtocolLogger("smtp.log"));
await m_client.ConnectAsync("outlook.office365.com", 587, SecureSocketOptions.StartTls);
await m_client.AuthenticateAsync(oauth2);
}


Подробнее здесь: https://stackoverflow.com/questions/672 ... r-side-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»