如何解决在多租户Azure函数中使用图App凭据
我正在研究一种Azure函数,该函数对不同的租户(多租户)进行一些图形调用 我想重用GraphServiceClient并利用令牌缓存 我以这种方式生成GraphServiceClient:
List<string> scopes = new List<string>() { "https://graph.microsoft.com/.default" };
var authProvider = ConfidentialClientApplicationBuilder.Create("e9b93362-a788-4644-8623-da9f4d4776a7")
.WithAuthority(AzureCloudInstance.AzurePublic,AadAuthorityAudience.AzureAdMultipleOrgs)
.WithClientSecret("fkpx53225awyQJDHV35:^][")
.Build();
var dd = new MsalAuthenticationProvider(authProvider,scopes.ToArray(),"ugochotmail.onmicrosoft.com");
var appGraphClient = new GraphServiceClient(dd);
比我应该打电话
authResult = await _clientApplication.AcquireTokenForClient(_scopes)
.WithAuthority(AzureCloudInstance.AzurePublic,Tenant)
.ExecuteAsync();
为应用获取访问特定租户的令牌。 问题在于身份验证提供程序会在每个发送请求上调用,但不提供带有租户名称的参数
public async Task AuthenticateRequestAsync(HttpRequestMessage request)
{
var token = await GetTokenAsync();
request.Headers.Authorization = new AuthenticationHeaderValue("bearer",token);
}
此刻,我只是将一个属性添加到身份验证提供程序以设置租户。它可行,但我想知道是否有更好的解决方案
解决方法
据我了解,似乎您的函数不允许使用参数来指定租户名称,然后在执行GetTokenAsync()
方法时使用租户名称。现在,您只需在new MsalAuthenticationProvider(...
行中对租户名称进行硬编码即可指定租户。
对于这个问题,我认为您可以在函数应用程序的“ 应用程序设置”中添加一个名为tenant
的变量(如下图所示)。
然后在string tenant = System.Environment.GetEnvironmentVariable("tenant");
上方添加一行代码var token = await GetTokenAsync();
然后,您可以像GetTokenAsync()
一样在方法GetTokenAsync(tenant)
中添加参数。然后,您无需在代码中对租户名称进行硬编码,只需在功能的“ 应用程序设置”中更改租户名称。
如果我误解了您的要求,请提供更多详细信息。
============================= 更新 =========== ====================
似乎您只想通过参数在代码中指定租户,但不希望在var dd = new MsalAuthenticationProvider(authProvider,scopes.ToArray(),"tenant name");
中将租户名称添加为属性。如果是这样,您可以参考下面的代码(在执行.WithTenantId("xxx.onmicrosoft.com")
时只需添加一行ConfidentialClientApplicationBuilder
)
否,这不能解决问题,因为在多租户中,目标租户作为参数发送给函数。我正在尝试另一种方法,当我完成测试时会回来。 非常感谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。