Как выполнять интеграционные тесты с помощью AzureAD, если включен 2FA

#c# #asp.net-core #azure-active-directory #integration-testing #microsoft-identity-platform

#c# #asp.net-core #azure-active-directory #интеграция-тестирование #microsoft-identity-platform

Вопрос:

Я пытаюсь настроить интеграционные тесты в проекте, где приложение защищено AzureAD (Microsoft.Идентификация.Web) и 2FA. Обычно пользователь входит в приложение с помощью SPA, и его приветствует всплывающее окно входа или перенаправления. При тестировании конечных точек контроллера нет SPA, и мы не используем поток от имени пользователя, поэтому я подумал, что могу просто получить токен обычным способом для целей тестирования:

 [HttpPost]
public async Task<IActionResult> GetTokenAsync([FromBody] TokenRequest model)
{
    
    _client.BaseAddress = new Uri("https://login.microsoftonline.com/");
    var content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
           /* ... */
    }

    var response = await _client.PostAsync($"{_options.TenantId}/oauth2/v2.0/token", content);
    var responseContent = await response.Content.ReadAsStringAsync();
    var token = JsonConvert.DeserializeObject<dynamic>(responseContent);

   return Ok(new TokenResponse { Token = token.id_token });
}
 

Однако из-за включения 2FA я получаю следующую ошибку:

 {{
  "error": "invalid_grant",
  "error_description": "AADSTS50158: External security challenge not satisfied. User will be redirected to another page or authentication provider to satisfy additional authentication 
  "error_codes": [
    50158
  ],
  "timestamp": "2020-12-04 12:41:10Z",
  "trace_id": "xxxxxxxxxxxxxx",
  "correlation_id": "xxxxxxxxxxxxxxxxxxx",
  "error_uri": "https://login.microsoftonline.com/error?code=50158",
  "suberror": "basic_action",
  "claims": "{ /* ... */}"
}}
 

Более понятная для человека версия: https://login.microsoftonline.com/error?code=50158

Вот соответствующая часть для конфигурации аутентификации:

 public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(o =>
    {
        o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
     .AddMicrosoftIdentityWebApi(this.Configuration)
          .EnableTokenAcquisitionToCallDownstreamApi()
             .AddMicrosoftGraph(this.Configuration.GetSection("DownstreamApi"))
             .AddInMemoryTokenCaches();

    /* ... */
}
 

Есть ли способ удовлетворить требование 2FA во время тестирования или обойти его, сохранив при этом базовый механизм токенов без изменений?

Обновление, чтобы устранить любую возможную путаницу: я ориентируюсь на автоматические тесты без вмешательства человека. Я знаю, что могу использовать макет схемы аутентификации с пользовательской WebApplicationFactory , но я бы выбрал менее поддельный подход, если это возможно.

Комментарии:

1. Я думаю, вы можете использовать поток кода авторизации OAuth 2.0 для получения токена refesh. Затем вы используете токен обновления для запроса токена для тестирования. Для получения более подробной информации, пожалуйста, обратитесь к docs.microsoft.com/en-us/azure/active-directory/develop /…

2. Спасибо за предложение, но я думаю, что сейчас вы на шаг впереди. В первую очередь мне нужен действительный токен. Токен обновления сейчас не поможет

3. Привет. Я предлагаю вам использовать поток для завершения MFA и получения токена обновления. Затем используйте токен обновления для выполнения вашего теста?

4. Как мне это сделать во время автоматического тестирования на сервере сборки? … Может быть, мне следует упомянуть об этом в моем вопросе, если это непонятно

5. Поскольку вы настроили MFA в своем Azure AD, мы должны выполнить MFA вручную. Поэтому я думаю использовать поток кода авторизации OAuth 2.0 для завершения MFA и получения токена refesh. Затем используйте токен обновления в своем тестовом коде, чтобы получить токен доступа. Это хороший способ. Или вы используете поток учетных данных клиента.