2017-06-24 6 views
2

Azureサブスクリプションとテナントをプログラムで列挙するには?これは以前の質問Login-AzureRmAccount (and related) equivalent(s) in .NET Azure SDKに関連しています。Azureサブスクリプションとテナントをプログラムで列挙するには?

基本的には、Login-AzureRmAccountGet-AzureRmSubscriptionの動作をデスクトップまたはコンソールアプリケーションに複製しようとしています。これまでのところ、私はMSALがクライアントIDとテナントIDを常に必要としているように思っています。そのため、他のライブラリを取得する必要があります。その後、最新のライブラリを使用してプログラム主体をプログラムで作成したいと思っていますが、それはさらなる調査(および必要に応じて質問)の対象であると思います。

答えて

2

実は、Login-AzureRmAccountGet-AzureRmSubscriptionResource Manager REST APIsを通じてAzureのリソースを操作するマイクロソフトのAzure PowerShellのアプリを使用しています。

RESTをPowershellコマンドとして使用して同じ操作をシミュレートするには、このアプリケーションを使用することもできます。しかし、このアプリはAzureポータル(v2.0アプリではない)に登録しているので、MSAL経由でこのアプリを使用してトークンを取得することはできません。 MSALの代わりにAdalを使用する必要があります。ここで

は、あなたの参考のために、このアプリを使用してMicrosoft.WindowsAzure.Managementを経由して管理者アカウントを使用してサブスクリプションを一覧表示するためのコードサンプルです:

public static void ListSubscriptions() 
{ 
    string authority = "https://login.microsoftonline.com/common"; 
    string resource = "https://management.core.windows.net/"; 
    string clientId = "1950a258-227b-4e31-a9cf-717495945fc2"; 
    Uri redirectUri = new Uri("urn:ietf:wg:oauth:2.0:oob"); 
    AuthenticationContext authContext = new AuthenticationContext(authority); 
    var access_token = authContext.AcquireTokenAsync(resource, clientId, redirectUri, new PlatformParameters (PromptBehavior.Auto)).Result.AccessToken; 

    var tokenCred = new Microsoft.Azure.TokenCloudCredentials(access_token); 
    var subscriptionClient = new SubscriptionClient(tokenCred); 
    foreach (var subscription in subscriptionClient.Subscriptions.List()) 
    { 
     Console.WriteLine(subscription.SubscriptionName); 
    } 
} 

更新:

string resource = "https://management.core.windows.net/"; 
string clientId = "1950a258-227b-4e31-a9cf-717495945fc2"; 
string userName = ""; 
string password = ""; 

HttpClient client = new HttpClient(); 
string tokenEndpoint = "https://login.microsoftonline.com/common/oauth2/token"; 
var body = $"resource={resource}&client_id={clientId}&grant_type=password&username={userName}&password={password}"; 
var stringContent = new StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded"); 

var result = client.PostAsync(tokenEndpoint, stringContent).ContinueWith<string>((response) => 
{ 
    return response.Result.Content.ReadAsStringAsync().Result; 
}).Result; 

JObject jobject = JObject.Parse(result); 
var token = jobject["access_token"].Value<string>(); 

client.DefaultRequestHeaders.Add("Authorization", $"bearer {token}"); 
var subcriptions = client.GetStringAsync("https://management.azure.com/subscriptions?api-version=2014-04-01-preview").Result; 

Console.WriteLine(subcriptions); 
+0

奇妙な。私はNuGetパッケージ 'Microsoft.IdentityModel.Clients.ActiveDirectory 3.14.0'をインストールし、もし'var access_token = authContext.AcquireTokenAsync(resource、clientId、redirectUri、new Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters(PromptBehavior.Auto))を作成すると、 .Result; '、そのようなクラスはありません。 'PromptBehavior.Auto'を除外すると、私は' NotImplementedException'を取得します。私はそれは[ここ](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-devquickstarts-dotnet)と他の場所で使用しています。それは 'Microsoft.WindowsAzure.Management'から来るだろうか? – Veksi

+0

.NET Coreコンソールアプリケーションがあり、コンストラクタが不足している可能性があります。私はこれをさらに約12時間後に調べますが、あなたが与えた例(そしてコード例に関しては悲しいことですが)に関しては、.NET Coreが原因です。 – Veksi

+0

@Veksi上記のコードは.NET Frameworkのみで動作します。このテストに基づいて、ADALは 'Microsoft.IdentityModel.Clients.ActiveDirectory.WebUIFactory.CreateAuthenticationDialog(IPlatformParametersパラメータ)'を実装しません。あなたがそれを.netコアでサポートしたいのであれば、[ここ](https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/issues)からadalライブラリのフィードバックを上げることをお勧めします。 –

関連する問題