Azure аутентификация для нескольких аудиторий с использованием WithExtraScopesToConsent и AcquireTokenSilent - PullRequest
1 голос
/ 19 февраля 2020

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

https://docs.microsoft.com/bs-latn-ba/azure/active-directory/develop/msal-net-user-gets-consent-for-multiple-resources

, и мой код выглядит так:

         IPublicClientApplication client = PublicClientApplicationBuilder.Create(clientId)
                    .WithAuthority(AadAuthorityAudience.AzureAdMultipleOrgs)
                    .WithDefaultRedirectUri()
                //  .WithRedirectUri($"msal{clientId}://auth")
                .Build();

        var accounts = client.GetAccountsAsync().Result;
            string[] scopes = { "https://management.azure.com/user_impersonation" };
            string[] scopestorage = { "https://storage.azure.com/user_impersonation" };

            var result = client.AcquireTokenInteractive(scopes)
                                  .WithAccount(accounts.FirstOrDefault())
                                  .WithExtraScopesToConsent(scopestorage)
                                  .ExecuteAsync().Result;
          var result2=  client.AcquireTokenSilent(scopestorage, accounts.FirstOrDefault()).ExecuteAsync();

, но я получаю исключение при выполнении метод AcquireTokenInteractive

Microsoft.Identity.Client.MsalUiRequiredException: 'No account or login hint was passed to the AcquireTokenSilent call.'

Кроме того, когда я смотрю в локальные переменные "Мои учетные записи", я вижу количество = 0 и ничего там.

Любой указатель для решения будет принят с благодарностью .

С уважением

Винсент

1 Ответ

1 голос
/ 20 февраля 2020

Вам необходимо внести некоторые изменения в свой код. Вот рабочий пример для справки:

string[] scopes = { "https://management.azure.com/user_impersonation" };
            string[] scopestorage = { "https://storage.azure.com/user_impersonation" };
            IPublicClientApplication client = PublicClientApplicationBuilder
                .Create("cbc32712-ac27-4532-802d-303998a6e712")
                .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
                .Build();

            var result = client.AcquireTokenInteractive(scopes)
                                  .ExecuteAsync().Result;
            var accounts = client.GetAccountsAsync().Result;
            var result2 = client.AcquireTokenSilent(scopestorage, accounts.FirstOrDefault()).ExecuteAsync().Result;

Примечание:

1. Поскольку вы получите токен доступа к ресурсу хранилища, используя метод AcquireTokenSilent, убедитесь, что вы предоставили согласие пользователя / администратора на доступ вашего ресурса к этому приложению.

2.Вы не можете использовать метод WithExtraScopesToConsent для разных конечных точек ресурса.

...