Я пытаюсь использовать https://github.com/Azure/azure-libraries-for-net для проверки подлинности в Azure из приложения командной строки. Моя цель - перечислить все учетные записи хранения во всех арендаторах и во всех подписках, используя текущие библиотеки, но безуспешно.
FromDevice
метод действительно работает хорошо, если я использую common
в качестве идентификатора арендатора:
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
и т. Д.).