Erro ao fazer a chamada da API da Biblioteca de Gerenciamento do Azure ao autenticar com o Active Directory do azure

Minha empresa está estudando os relatórios no Azure. Queremos apenas que nossos clientes nos dêem credenciais de somente leitura para usarmos. Eu fiz algumas pesquisas e parece que o Azure Active Directory faz exatamente isso. Então, eu estou procurando autenticar usando um Aplicativo de Diretório do Azure somente leitura.

Para começar, segui este blog sobre o uso da API de gerenciamento via Azure Active Directory.

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

Além da abordagem ser muito hostil, ela não funciona = (

Eu recebo esse erro depois de fazer login como administrador global:

"AADSTS90014: O corpo da solicitação deve conter o seguinte parâmetro: 'client_secret ou client_assertion'."

Fiz algumas pesquisas e descobri que esse estilo de autenticação era para aplicativos nativos e NÃO para aplicativos da web (apesar do que a postagem do blog dizia de outra maneira ..). Então eu fiz um ajuste. Meu GetAuthorizationHeader agora fica assim:

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

Consigo obter o token de acesso (yay). Mas agora, quando tento usar isso com o cliente da biblioteca de Gerenciamento do Azure, recebo este erro:

"ForbiddenError: o servidor falhou ao autenticar a solicitação. Verifique se o certificado é válido e está associado a esta assinatura."

Eu verifiquei minhas permissões no meu aplicativo. Parecia bom. Tentei dar acesso total a tudo para ver se isso faria alguma diferença.

Verifiquei meu tenantId, clientId e subscriptionId, tudo parecia bom.

Verifiquei se a assinatura que estou usando está apontada para o AD em que meu aplicativo está.

Eu tentei fazer uma nova chave secreta.

Meu palpite é que este é o problema:No entanto, nesta interface do usuário, não consigo selecionar nenhum valor para essa propriedade. Não tenho certeza se isso é resultado de um bug ou de um recurso inacabado. Estou faltando alguma coisa aqui?

obrigado

Aqui está o meu código completo para referência:

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: Progresso foi feito. Como discuti com Gaurav, eu precisava abandonar a Biblioteca de Gerenciamento do Azure porque, no momento, ele não parece oferecer suporte à API do Azure Resource Manager (ARM)! Então, em vez disso, fiz solicitações brutas da Web. E funciona como pretendido. Se eu remover o acesso à função do meu aplicativo do AD, o acesso será negado. Quando o recebo, recebo de volta os dados.

Uma coisa que não tenho certeza é fazer com que meu aplicativo seja adicionado automaticamente a novos recursos.

Além disso, existe uma maneira de listar grupos de recursos acessíveis para meu aplicativo AD?

Novo Código:

    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: Eu descobri o meu desligado. Os recursos criados no portal OLD obterão seu próprio grupo de recursos distintos.

Pelo que posso dizer, você não pode adicionar um recurso criado no antigo grupo de recursos existente do portal (boooo). Os recursos criados no novo portal poderão atribuir o recurso a um grupo existente (também conhecido como um que dá acesso à função do meu aplicativo AD).

Isso é uma bagunça! Mas pelo menos eu sei o que está acontecendo agora.

questionAnswers(1)

yourAnswerToTheQuestion