使用 With ExtraScopesToConsent 和 AcquireTokenSilent 对多个受众进行 Azure 身份验证
Azure authentification for multiple audience using WithExtraScopesToConsent and AcquireTokenSilent
我正在构建一个应用程序,让用户可以操作 Azure 资源和 Azure 存储,因此我需要访问多个受众,但是,不可能在 azure 中与多个受众进行一个令牌。所以我正在使用本教程
我的代码如下:
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
方法。
我正在构建一个应用程序,让用户可以操作 Azure 资源和 Azure 存储,因此我需要访问多个受众,但是,不可能在 azure 中与多个受众进行一个令牌。所以我正在使用本教程
我的代码如下:
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
方法。