我在租户 A 中有一个 C# 多租户 Azure Function App,它使用 Microsoft Identity Platform 进行身份验证。它已在租户 A 和租户 B 中被授予应用程序级 Microsoft Graph 权限 (
Directory.Read.All
)。使用客户端机密凭据,我可以成功从租户 A 和租户 B 检索用户列表,无论该函数是否正在运行本地或部署在云端。
我想了解是否可以利用功能应用程序本身的身份(即使用托管身份)而不是客户端密钥来访问租户 B 的用户。具体来说,我希望租户 A 中的功能应用程序访问用户在租户 B 中通过 .NET Microsoft Graph SDK 实现,无需依赖客户端密钥。 任何人都可以提供有关如何实现这一目标的指导吗? 预先感谢。
注意:托管标识只能用于访问同一租户和特定的 Azure 订阅用户/资源,无法访问其他租户用户/资源。请参阅 SO Thread,作者为 Philippe Signoret 以及此 MsDoc
因此,如果您不希望用户交互来获取结果,则需要使用客户端秘密凭证流。
如果用户交互流程在您的设置中有效,那么您可以使用交互式提供商流程,如下所示:
在
TenantA
中,我创建了一个多租户应用程序并配置了重定向 URL,如下所示:
并使用以下代码:
class Program
{
static async Task Main(string[] args)
{
var scopes = new[] { "Directory.Read.All" };
var tenantId = "organizations";
var clientId = "ClientID";
var options = new InteractiveBrowserCredentialOptions
{
TenantId = tenantId,
ClientId = clientId,
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
RedirectUri = new Uri("http://localhost"),
};
var interactiveCredential = new InteractiveBrowserCredential(options);
var graphClient = new GraphServiceClient(interactiveCredential, scopes);
await FetchUsers(graphClient);
}
private static async Task FetchUsers(GraphServiceClient graphClient)
{
try
{
var result = await graphClient.Users.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Select = new string[] { "id", "displayName" };
});
foreach (var user in result.Value)
{
Console.WriteLine($"User ID: {user.Id}, Display Name: {user.DisplayName}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error fetching users: {ex.Message}");
}
}
}
我登录了
TenantB
用户:
并成功获得用户:
如果上述内容不适合您的环境,那么您还可以使用基于证书的身份验证来获取客户端机密凭证,而不是使用客户端机密。