実は、Login-AzureRmAccount
とGet-AzureRmSubscription
はResource 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);
奇妙な。私は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
.NET Coreコンソールアプリケーションがあり、コンストラクタが不足している可能性があります。私はこれをさらに約12時間後に調べますが、あなたが与えた例(そしてコード例に関しては悲しいことですが)に関しては、.NET Coreが原因です。 – Veksi
@Veksi上記のコードは.NET Frameworkのみで動作します。このテストに基づいて、ADALは 'Microsoft.IdentityModel.Clients.ActiveDirectory.WebUIFactory.CreateAuthenticationDialog(IPlatformParametersパラメータ)'を実装しません。あなたがそれを.netコアでサポートしたいのであれば、[ここ](https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/issues)からadalライブラリのフィードバックを上げることをお勧めします。 –