Я создаю демон / неинтерактивную службу для использования EWS в O365 в качестве конкретного пользователя. Чтобы связаться с EWS через OAUTH2.0, я пытаюсь правильно зарегистрировать приложение и пройти аутентификацию на AAD. Желательно, чтобы я использовал аутентификацию на основе сертификатов, но я не получил этого.
Код ниже (работает):
static void Main(string[] args)
{
string tenant = "redacted.onmicrosoft.com";
string authority = "https://login.microsoftonline.com/" + tenant;
string clientId = "44964df2-3333-2222-1111-redcated";
string resource = "https://outlook.office365.com";
string clientSecret = "redacted";
string username = "username@redacted.onmicrosoft.com";
string password = "redacted";
AuthenticationResult authenticationResult = null;
AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);
var userCred = new UserPasswordCredential(username, password);
ClientCredential clientCred = new ClientCredential(clientId, clientSecret);
string errorMessage = null;
try
{
Console.WriteLine("Trying to acquire token");
authenticationResult = authenticationContext.AcquireTokenAsync(resource, clientId, userCred).Result;
}
catch (AdalException ex)
{
errorMessage = ex.Message;
if (ex.InnerException != null)
{
errorMessage += "\nInnerException : " + ex.InnerException.Message;
}
}
catch (ArgumentException ex)
{
errorMessage = ex.Message;
}
if (!string.IsNullOrEmpty(errorMessage))
{
Console.WriteLine("Failed: {0}" + errorMessage);
return;
}
Console.WriteLine("\nMaking the protocol call\n");
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
service.Credentials = new OAuthCredentials(authenticationResult.AccessToken);
service.TraceEnabled = true;
service.TraceFlags = TraceFlags.All;
service.Url = new Uri(resource + "/EWS/Exchange.asmx");
EmailMessage email = new EmailMessage(service);
email.ToRecipients.Add("redacted@gmail.com");
email.Subject = "HelloWorld from EWS";
email.Body = new MessageBody("Test from EWS");
email.Send();
}
Этот код работает как задумано, однако мне также необходимо убедиться, что он безопасен / соответствует передовой практике.
При использовании кода я зарегистрировал приложение как "Native", однако позже обнаружил, что в руководстве Micrsofts сказано, что вы не должны использовать client_secret с приложениями Native, и секретный код клиента фактически не используется кодом ни в его текущая форма.
Учитывая вариант использования (неинтерактивная служба аутентифицируется как один конкретный пользователь), это правильный подход?
Что следует учитывать при регистрации службы в AAD?