2017-06-24 6 views
2

Comment énumérer les abonnements et les locataires Azure par programme? Ceci est lié à ma question précédente Login-AzureRmAccount (and related) equivalent(s) in .NET Azure SDK.Comment énumérer les abonnements et les locataires Azure par programme?

Fondamentalement, je tente de répliquer le comportement de Login-AzureRmAccount et Get-AzureRmSubscription dans le bureau ou une application de console. Jusqu'à présent, j'ai compris que MSAL semble toujours avoir besoin de l'ID du client et de l'ID du locataire, donc il doit y avoir une autre bibliothèque pour en obtenir. Après cela, je voudrais créer un service principal par programmation en utilisant la bibliothèque la plus récente, mais je suppose que c'est un sujet à approfondir (et des questions si nécessaire).

Répondre

2

En fait, le Login-AzureRmAccount et Get-AzureRmSubscription utiliser la ressource Azure Azure application Microsoft PowerShell pour fonctionner par Resource Manager REST APIs.

Pour simuler les mêmes opérations en utilisant REST comme commandes PowersShell, nous pouvons également utiliser cette application. Cependant, comme cette application est enregistrée sur le portail Azure (pas l'application v2.0), nous ne sommes pas en mesure d'acquérir le jeton en utilisant cette application via MSAL. Nous devons utiliser Adal au lieu de MSAL.

Voici un exemple de code à la liste des abonnements utilisant un compte administrateur via Microsoft.WindowsAzure.Management en utilisant cette application pour votre référence:

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); 
    } 
} 

Mise à jour:

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

étrange. J'installe le paquet NuGet 'Microsoft.IdentityModel.Clients.ActiveDirectory 3.14.0' et si je fais'var access_token = authContext.AcquireTokenAsync (ressource, clientId, redirectUri, nouveau Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters (PromptBehavior.Auto)) .Result; ', il n'y a pas une telle classe. Si j'exclus 'PromptBehavior.Auto', j'obtiens' NotImplementedException'. Bien que je le vois utilisé [ici] (https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-devquickstarts-dotnet) et ailleurs. Cela vient-il de 'Microsoft.WindowsAzure.Management'? – Veksi

+0

Cela peut être pertinent J'ai une application console .NET Core et il se peut qu'il manque des constructeurs. J'examine cette question plus tard dans environ 12 heures, mais il se peut qu'en ce qui concerne l'exemple que vous avez donné (et mes malheurs en ce qui concerne les exemples de codes), .NET Core soit le coupable. – Veksi

+0

@Veksi Le code ci-dessus ne fonctionne que pour le .Net Framework. Basé sur le test, l'ADAL n'implémente pas le 'Microsoft.IdentityModel.Clients.ActiveDirectory.WebUIFactory.CreateAuthenticationDialog (paramètres IPlatformParameters)'. Je suggère que vous souleviez les commentaires pour la bibliothèque d'adal de [ici] (https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/issues) si vous voulez que le support pour .net core. –