首页 > 解决方案 > 如何在 Azure 管理 SDK 中通过一次登录访问所有租户和订阅

问题描述

我正在尝试使用https://github.com/Azure/azure-libraries-for-net从命令行应用程序对 Azure 进行身份验证。我的目标是使用流利的库列出所有租户和所有订阅中的所有存储帐户,但没有成功。

FromDevice方法实际上运行良好,如果我common用作租户 ID:

AzureCredentials credentials = SdkContext.AzureCredentialsFactory.FromDevice(
    AzureCliClientId,
    "common",
    AzureEnvironment.AzureGlobalCloud,
    code =>
    {
        Console.WriteLine(code.Message);
        return true;
    });

IAuthenticated authenticatedAzure = Azure.Authenticate(azureNativeCreds);

auth.Subscriptions.ListAsync但是,任何对有权访问多个租户或多个订阅的帐户的调用都会返回空的订阅列表。

我可以列出租户用户所属的auth.Tenants.ListAsync()并返回有效的租户列表,但是我现在找不到使用特定租户和订阅进行后续调用的方法。

实现我想要的一种方法是创建另一个实例,IAzure但会再次弹出身份验证对话框,即:

foreach(var tenant in await authenticatedAzure.Tenants.ListAsync())
{
    //create creds for tenant?
    //throws authentication dialog for every tenant

    var tenantCredentials = SdkContext.AzureCredentialsFactory.FromDevice(
        AzureCliClientId,
        tenant.TenantId,
        AzureEnvironment.AzureGlobalCloud,
        code =>
        {
            Console.WriteLine(code.Message);
            return true;
        });

  IAzure tenantAzure = await Azure.Authenticate(tcreds).WithDefaultSubscriptionAsync();

  var storageAccounts = await tenantAzure.StorageAccounts.ListAsync();
}

所以用户经常对弹出窗口感到恼火。另一个FromDevice不记得用户之前已经登录的问题,无论我是否将令牌缓存保存到磁盘(TokenCache.DefaultShared.BeforeWrite等)。

标签: c#azureazure-management-api

解决方案


根据我的测试,该方法Subscriptions.ListAsync只能返回用户默认租户中的订阅。例如,如果您使用该帐户xxx@xxx.onmicrosoft.com登录,它只会返回到 tenant 中的订阅xxx.onmicrosoft.com。更多详细信息,请参阅文档

详情如下。1.注册 Azure AD 公共客户端应用程序 2. 为您使用的 Azure AD 应用程序配置权限。 在此处输入图像描述 在此处输入图像描述

  1. 代码
var cred= SdkContext.AzureCredentialsFactory.FromDevice("731373ea-9249-45aa-a7da-79c083a9d8b0", "common",AzureEnvironment.AzureGlobalCloud, code =>
            {
                Console.WriteLine(code.Message);
                return true;
            });

            var azure = Azure.Authenticate(cred);
            var subs = azure.Subscriptions.List();
            foreach (var sub in subs) {

                Console.WriteLine(sub.DisplayName);
            }

更新

在此处输入图像描述 在此处输入图像描述


推荐阅读