Наша компания недавно внедрила многофакторную аутентификацию; Я уже переписал интерактивное приложение, которое позволяет пользователю отправлять электронную почту с помощью 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
Мобильная версия