Как проверить защищенный веб-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", который даст согласие на заявку от имени всего арендатора. С таким согласием вам нужно будет сделать это только один раз для каждого приложения, чтобы оно заработало.
Надеюсь, это поможет!