Как проверить защищенный веб-API Azure AD с помощью тестового адаптера Visual Studio?

Я создал многопользовательский веб-API, который прекрасно работает. Теперь я хочу построить собственный клиент для тестирования. Приложение Web API определено в одном клиенте. Тестовое приложение определено в другом клиенте, который дал согласие администратора на веб-API.

Я хочу использовать собственное приложение для аутентификации с использованием имени пользователя и пароля в моих (неинтерактивных) интеграционных тестах. Я не могу использовать сертификат / приложение только для аутентификации, потому что мне нужен реальный пользовательский контекст.

Получение токена

var userCredential = new UserCredential("admin@clienttenant.onmicrosoft.com", "password");
var context = new AuthenticationContext("https://login.windows.net/common");

return context.AcquireToken("https://webapitenant.onmicrosoft.com/webApiResourceUri", testClientId, userCredential).AccessToken;

Проблема с этим кодом заключается в том, что он не работает, пока я не дам согласие администратора на собственное приложение, даже если пользователь находится в том же арендаторе, что и приложение.

Исключение:

'Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException' in Microsoft.IdentityModel.Clients.ActiveDirectory.dll

Additional information: 
AADSTS65001: The user or administrator has not consented to use the application with ID 'nativeclientid'. Send an interactive authorization request for this user and resource. 

Поскольку тесты не являются интерактивными, я должен создать консольное приложение, которое использует приведенный выше код, но с PromptBehaviour.Always, Это запросит у меня имя пользователя и пароль и покажет форму согласия. После того, как я дал согласие, тесты, использующие ту же регистрацию приложения, начинают работать.

Есть ли способ принять форму согласия без интерактивного графического интерфейса?

1 ответ

Решение

На данный момент нет другого способа написать согласие пользователя без какого-либо пользовательского опыта. (Что имеет смысл правильно?)

Если вы используете портал управления Azure как администратор своего клиента, все создаваемые вами приложения должны автоматически соглашаться на выбранные вами ресурсы. Это связано с тем, что портал управления Azure специально будет писать эти ссылки согласия при сохранении клиентского приложения.

Если вы используете другие порталы или API-интерфейсы для создания своего приложения, вам нужно будет дать согласие на использование приложения хотя бы один раз. Вам не нужно обязательно указывать быстрое поведение в своем приложении, чтобы получить экран согласия. Вы можете просто сгенерировать URL-адрес для входа в свое приложение, что также поможет вам получить согласие:

https://login.microsoftonline.com/<TenantID>/oauth2/authorize?client_id=<AppID>&response_type=code&redirect_uri=<RedirectURI>&resource=<ResourceURI>&prompt=admin_consent

Обратите внимание, что в конце мы добавили "prompt = admin_consent", который даст согласие на заявку от имени всего арендатора. С таким согласием вам нужно будет сделать это только один раз для каждого приложения, чтобы оно заработало.

Надеюсь, это поможет!