Fehler beim Aufrufen der Azure Management Library-API bei der Authentifizierung mit Azure Active Directory

Mein Unternehmen prüft die Berichterstellung für Azure. Wir möchten nur, dass unsere Kunden uns nur Leserechte geben, die wir verwenden können. Ich habe einige Nachforschungen angestellt und es sieht so aus, als würde Azure Active Directory genau das tun. Daher möchte ich mich mit einer schreibgeschützten Azure Directory-Anwendung authentifizieren.

Zum Einstieg verfolgte ich dieses Blog zur Verwendung der Verwaltungs-API über Azure Active Directory.

https: //msdn.microsoft.com/en-us/library/azure/dn722415.asp

bgesehen von der Annäherungsshow, die sehr unfreundlich ist, funktioniert es nicht =

Ich erhalte diesen Fehler, nachdem ich mich als globaler Administrator angemeldet habe:

"AADSTS90014: Der Anforderungshauptteil muss den folgenden Parameter enthalten: 'client_secret oder client_assertion'."

Habe einige Nachforschungen angestellt und festgestellt, dass diese Art der Authentifizierung für native Apps und NICHT für Web-Apps gilt (obwohl der Blog-Beitrag etwas anderes sagt ..). Also habe ich einen Tweak gemacht. Mein GetAuthorizationHeader sieht jetzt so aus:

    private static string GetAuthorizationHeader()
    {
        AuthenticationResult result = null;

        var context = new AuthenticationContext("https://login.windows.net/" + ConfigurationManager.AppSettings["tenantId"]);

        string clientId = ConfigurationManager.AppSettings["clientId"];
        string clientSecret = ConfigurationManager.AppSettings["clientSecret"];
        ClientCredential clientCred = new ClientCredential(clientId, clientSecret);

        var thread = new Thread(() =>
        {
            result = context.AcquireToken(
              "https://management.core.windows.net/",
              clientCred);
        });

        thread.SetApartmentState(ApartmentState.STA);
        thread.Name = "AquireTokenThread";
        thread.Start();
        thread.Join();

        if (result == null)
        {
            throw new InvalidOperationException("Failed to obtain the JWT token");
        }

        string token = result.AccessToken;
        return token;
    }

Ich bin in der Lage, das Zugriffstoken zu erhalten (yay). Wenn ich jetzt versuche, dies mit dem Azure Management-Bibliotheksclient zu verwenden, wird der folgende Fehler angezeigt:

"ForbiddenError: Der Server konnte die Anforderung nicht authentifizieren. Stellen Sie sicher, dass das Zertifikat gültig und mit diesem Abonnement verknüpft ist."

Ich habe meine Berechtigungen in meiner Anwendung doppelt überprüft. Es sah gut aus. Ich habe versucht, vollen Zugriff auf alles zu gewähren, um festzustellen, ob dies einen Unterschied gemacht hätte.

Ich habe meine TenantId, ClientId und SubscriptionId überprüft und alles sah gut aus.

Ich habe sichergestellt, dass das Abonnement, das ich verwende, auf das AD verweist, in dem sich meine Anwendung befindet.

Ich habe versucht, einen neuen geheimen Schlüssel zu erstellen.

Meine Vermutung ist dies das Problem:In dieser Benutzeroberfläche kann ich jedoch keine Werte für diese Eigenschaft auswählen. Ich bin mir nicht sicher, ob dies auf einen Fehler oder eine unvollendete Funktion zurückzuführen ist. Vermisse ich hier etwas?

Vielen Dan

Hier ist mein vollständiger Code als Referenz:

class Program
{
    static void Main(string[] args)
    {
        var token = GetAuthorizationHeader();

        var credential = new TokenCloudCredentials(ConfigurationManager.AppSettings["subscriptionId"], token);

        using (var computeClient = new ComputeManagementClient(credential))
        {
            var images = computeClient.VirtualMachineOSImages.List();
        }
    }

    private static string GetAuthorizationHeader()
    {
        AuthenticationResult result = null;

        var context = new AuthenticationContext("https://login.windows.net/" + ConfigurationManager.AppSettings["tenantId"]);

        string clientId = ConfigurationManager.AppSettings["clientId"];
        string clientSecret = ConfigurationManager.AppSettings["clientSecret"];
        ClientCredential clientCred = new ClientCredential(clientId, clientSecret);

        var thread = new Thread(() =>
        {
            result = context.AcquireToken(
              "https://management.core.windows.net/",
              clientCred);
        });

        thread.SetApartmentState(ApartmentState.STA);
        thread.Name = "AquireTokenThread";
        thread.Start();
        thread.Join();

        if (result == null)
        {
            throw new InvalidOperationException("Failed to obtain the JWT token");
        }

        string token = result.AccessToken;
        return token;
    }
}

EDIT: Es wurden Fortschritte erzielt. Wie ich mit Gaurav besprochen habe, musste ich die Azure-Verwaltungsbibliothek fallen lassen, da sie anscheinend ab sofort die Azure Resource Manager (ARM) -API nicht unterstützt. Also habe ich stattdessen rohe Web-Anfragen gemacht. Und es funktioniert wie vorgesehen. Wenn ich den Rollenzugriff aus meiner AD-Anwendung entferne, wird mir der Zugriff verweigert. Wenn ich es habe, erhalte ich Daten zurück.

Eine Sache, bei der ich mir nicht sicher bin, ist, dass meine Anwendung automatisch neue Ressourcen hinzufügt.

Auch gibt es eine Möglichkeit, Ressourcengruppen aufzulisten, auf die meine AD-Anwendung zugreifen kann?

Neuer Code

    class Program
{
    static void Main(string[] args)
    {
        var token = GetAuthorizationHeader();

        string subscriptionId = ConfigurationManager.AppSettings["subscriptionId"];
        string resourceGroupName = ConfigurationManager.AppSettings["resourceGroupName"];
        var uriListMachines = string.Format("https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/virtualmachines?api-version=2015-05-01-preview", subscriptionId, resourceGroupName);
        var t = WebRequest.Create(uriListMachines);
        t.ContentType = "application/json";
        t.Headers.Add("Authorization", "Bearer " + token);
        var response = (HttpWebResponse)t.GetResponse();

        string result = "";
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            result = reader.ReadToEnd(); 
        }

        //Original Attempt:
        //var credential = new TokenCloudCredentials(ConfigurationManager.AppSettings["subscriptionId"], token);

        //using (var client = CloudContext.Clients.CreateComputeManagementClient(credential))
        //{
        //    var images = client.VirtualMachineVMImages.List();
        //}
    }

    private static string GetAuthorizationHeader()
    {
        AuthenticationResult result = null;

        var context = new AuthenticationContext("https://login.windows.net/" + ConfigurationManager.AppSettings["tenantId"]);

        string clientId = ConfigurationManager.AppSettings["clientId"];
        string clientSecret = ConfigurationManager.AppSettings["clientSecret"];
        ClientCredential clientCred = new ClientCredential(clientId, clientSecret);

        var thread = new Thread(() =>
        {
            result = context.AcquireToken(
              "https://management.core.windows.net/",
              clientCred);
        });

        thread.SetApartmentState(ApartmentState.STA);
        thread.Name = "AquireTokenThread";
        thread.Start();
        thread.Join();

        if (result == null)
        {
            throw new InvalidOperationException("Failed to obtain the JWT token");
        }

        string token = result.AccessToken;
        return token;
    }
}

EDIT EDIT: Ich habe herausgefunden, dass ich aufgelegt habe. Ressourcen, die im ALTEN Portal erstellt wurden, erhalten eine eigene Ressourcengruppe.

Von dem, was ich sagen kann, können Sie keine Ressource hinzufügen, die in der vorhandenen Ressourcengruppe des alten Portals erstellt wurde (boooo). In dem neuen Portal erstellte Ressourcen können die Ressource einer vorhandenen Gruppe zuweisen (auch bekannt als eine Gruppe, die einen Rollenzugriff auf meine AD-Anwendung gewährt).

Das ist so ein Durcheinander! Aber zumindest weiß ich jetzt, was los ist.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage