Аутентификация API Azure WVD Rest

У меня есть приложение aspnetcore, которое я пишу, и я хотел бы иметь возможность управлять ресурсами WVD. Проблема в том, что токен на предъявителя, который я получаю от Msal, дает мне 401, когда я пытаюсь

GET https://rdweb.wvd.microsoft.com/api/feeddiscovery/webfeeddiscovery.aspx

Я подумал, может быть, мне нужно добавить разрешение API для моего приложения в лазурном стиле, но я уже добавил:

https://management.azure.com/user_impersonation

И я не могу найти ничего, что предполагало бы, что это могло бы работать для WVD.

Может, я сбился с пути.

Я пробовал посмотреть на источник:

https://github.com/Azure/RDS-Templates/tree/master/wvd-templates/wvd-management-ux/deploy

Но он был скомпилирован и минифицирован, так что это оказалось непросто.

Мы будем очень благодарны за любую помощь в получении действительного токена для вызова WVD Rest API.

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

Полный код (без материала Microsoft.Identity.Web)

var token = await TokenAcquisition.GetAccessTokenOnBehalfOfUserAsync(new[] { "https://mrs-Prod.ame.gbl/mrs-RDInfra-prod/user_impersonation" });
            var httpClient = new HttpClient();
            httpClient.BaseAddress = new Uri("https://rdweb.wvd.microsoft.com/");
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");
            var result = await httpClient.GetAsync("api/hubdiscovery/eventhubdiscovery.aspx");
            result = await httpClient.GetAsync("api/feeddiscovery/webfeeddiscovery.aspx");

Этот метод взят из проекта Microsoft.Identity.Web.

2 ответа

Решение

Боже мой, я только что понял это, сравнив токен, который я получил из приложения msft rdweb:

Из приложения RDWeb: "aud": "https://mrs-prod.ame.gbl/mrs-RDInfra-prod",

Из моего приложения: "aud": "https://mrs-prod.ame.gbl/mrs-RDInfra-prod",

.... Да, я использовал букву P в верхнем регистре - mrs-Prod. И приложение msft использовало строчную букву p в mrs-prod.

Я ошеломлен, зол и взволнован одновременно.

Для записи я скопировал свое значение прямо из Azure на экране разрешений API приложений.

В https://management.azure.com это для Azure Service Management API, в вашем случае это не правильно.

Перейдите в приложение AD на портале -> API permissions -> APIs my organization uses -> поиск по Windows Virtual Desktop, найдите его и щелкните.

Если вы хотите, чтобы инструмент управления выполнял вызовы управления виртуальным рабочим столом Windows от имени пользователя, выполнившего вход в инструмент, выберите Delegated permissions -> user_impersonation, выполните шаги, как на скриншоте. Вы также можете дать пользователю согласие на разрешение самостоятельно, не нажимаяGrant admin consent кнопка, это зависит от вас.

Затем появится разрешение, как показано ниже.

Дополнительные сведения см. В этом учебном пособии: развертывание инструмента управления и этот шаг.

Обновить:

Попробуйте использовать powershell New-RdsRoleAssignment добавить учетную запись пользователя в качестве RDS Owner роль, убедитесь, что вы установили Microsoft.RDInfra.RDPowerShellмодуль, обратитесь к этой ссылке.

Add-RdsAccount -DeploymentUrl "https://rdbroker.wvd.microsoft.com"
Get-RdsTenant
New-RdsRoleAssignment -RoleDefinitionName "RDS Owner" -SignInName "xxxx@xxxx.onmicrosoft.com" -TenantName "joywvd"

Затем я запускаю Get-RdsTenantеще раз, и используйте скрипач, чтобы поймать запрос, получить токен, декодировать в https://jwt.io/, как показано ниже.

В aud а также scp должен быть таким же, как ваш токен, вы также можете декодировать свой токен для проверки, затем я использую почтальон для вызова https://rdweb.wvd.microsoft.com/api/feeddiscovery/webfeeddiscovery.aspx, оно работает.

Другие вопросы по тегам