c# - 如何在 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
等)。
解决方案
根据我的测试,该方法Subscriptions.ListAsync
只能返回用户默认租户中的订阅。例如,如果您使用该帐户xxx@xxx.onmicrosoft.com
登录,它只会返回到 tenant 中的订阅xxx.onmicrosoft.com
。更多详细信息,请参阅文档。
详情如下。1.注册 Azure AD 公共客户端应用程序 2. 为您使用的 Azure AD 应用程序配置权限。
- 代码
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);
}
更新
推荐阅读
- python - 如何减少多变量方程的代码行数?
- json - Jq 以编程方式获取第一个主要值
- javascript - 在不使用 nativeElement 的情况下从 @ViewChild 读取元素
- java - NavigationUI 在主页目的地显示后退(向上)按钮
- ios - 如何观察 AVPlayerItem 准备播放以停止 ActivityIndicator 的那一刻?
- sql - 将多行的值合并为单个
- java - 如何计算 StackMapTable 的框架图框架?
- django - 结合视图和视图集 Django
- android - 如何在 onUpdate 中获取有关 AppWidgetProvider 小部件的信息
- function - 我想使用函数更改 TextButton 的颜色