#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. Затем используйте токен обновления в своем тестовом коде, чтобы получить токен доступа. Это хороший способ. Или вы используете поток учетных данных клиента.