Azure AD AcquireToken не работает с паролем приложения

Я пытаюсь проверить пароль пользователя в Azure AD, используя библиотеку .NET ADAL. Это нормально работает для обычной учетной записи пользователя без MFA, но у меня возникли проблемы с этим для пользователя, у которого активирована MFA.

При использовании фактического пароля пользователя я получил AADSTS50076: Application password is required. , что достаточно справедливо, но когда я создал новый пароль приложения, я получил ошибку AADSTS70002: Error validating credentials. AADSTS50020: Invalid username or password AADSTS70002: Error validating credentials. AADSTS50020: Invalid username or password . Я создал несколько паролей приложений, но все они не работают.

Код, используемый для попытки аутентификации, выглядит следующим образом:

 var ac = new AuthenticationContext("https://login.windows.net/my-tenant.com"); var authResult = ac.AcquireToken("https://graph.windows.net", "my-client-id", new UserCredential("my.account@my-tenant.com", "my-password")); 

Пользователь, который пытается аутентифицироваться, является глобальным администратором в этом AD.

Возможно ли сделать такую ​​аутентификацию для пользователя с MFA?

Поэтому, чтобы ответить на мой собственный вопрос несколько, я прибег к выполнению следующего (очищенный для краткости):

 public class AzureAdAuthenticationProvider { private const string AppPasswordRequiredErrorCode = "50076"; private const string AuthorityFormatString = "https://login.windows.net/{0}"; private const string GraphResource = "https://graph.windows.net"; private AuthenticationContext _authContext; private string _clientId; public AzureAdAuthenticationProvider() { var tenantId = "..."; // Get from configuration _authContext = new AuthenticationContext(string.Format(AuthorityFormatString, tenantId)); } public bool Authenticate(string user, string pass) { try { _authContext.AcquireToken(GraphResource, _clientId, new UserCredential(user, pass)); return true; } catch (AdalServiceException ase) { return ase.ServiceErrorCodes.All(sec => sec == AppPasswordRequiredErrorCode); } catch (Exception) { return false; // Probably needs proper handling } } } 

Это некрасиво, но это делает работу.

Используя ServiceErrorCodes.All() , я гарантирую, что только при возникновении одной ошибки, связанной с AppPasswordRequired, аутентификация прошла успешно.

Единственным недостатком этого метода является то, что пользователь с включенным MFA должен использовать свой фактический пароль для входа в систему. Использование пароля приложения не поддерживается.