使用 With ExtraScopesToConsent 和 AcquireTokenSilent 对多个受众进行 Azure 身份验证

Azure authentification for multiple audience using WithExtraScopesToConsent and AcquireTokenSilent

我正在构建一个应用程序,让用户可以操作 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.'

另外,当我查看局部变量时,我的变量 "accounts" 我可以看到 Count=0,但里面什么也没有。

任何解决方案的指针将不胜感激。

此致

文森特

您需要对代码进行一些更改。这是供您参考的工作示例:

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.As 您将使用 AcquireTokenSilent 方法获取存储资源的访问令牌,确保您已授予 user/admin 同意您的应用程序访问此资源。

2.You 不能对不同的资源端点使用 WithExtraScopesToConsent 方法。