Como usar o Serviço de Gerenciamento do ACS para configurar certificados e chaves

Atualizado: 19 de junho de 2015

Aplica-se ao Azure

Aplica-se A

  • Access Control do Active Directory do Microsoft Azure (também conhecido como Access Control Service ou ACS)

Visão geral

Você pode configurar certificados e chaves ACS usando o Portal de Gerenciamento do ACS ou o Serviço de Gerenciamento do ACS. Trabalhar com o Serviço de Gerenciamento do ACS pode ser mais eficiente se você estiver criando uma interface de usuário personalizada para gerenciar o ACS ou se quiser automatizar a integração de um novo locatário para soluções SaaS (Software como serviço) multilocatário.

Para obter mais informações sobre como usar o Portal de Gerenciamento do ACS para configurar certificados e chaves, consulte Certificados e Chaves.

Etapas para configurar certificados e chaves usando o Serviço de Gerenciamento do ACS

Importante

Antes de executar as etapas a seguir, verifique se o sistema atende a todos os requisitos de estrutura e plataforma do .NET que são resumidos em pré-requisitos do ACS.

Para configurar certificados e chaves usando o Serviço de Gerenciamento do ACS, conclua as seguintes etapas:

  • Etapa 1 – Coletar informações de configuração do ACS

  • Etapa 2 – Criar um exemplo de aplicativo de console

  • Etapa 3 – Adicionar referências aos serviços e assemblies necessários

  • Etapa 4 – Implementar o cliente do Serviço de Gerenciamento

  • Etapa 5 – Instalar certificados e chaves

    • Adicionar um certificado de assinatura de token para o namespace do controle de acesso

    • Adicionar um certificado de assinatura de token para um aplicativo de terceira parte confiável

    • Adicionar uma chave simétrica assinatura de token para o namespace do controle de acesso

    • Adicionar uma chave simétrica assinatura de token para um aplicativo de terceira parte confiável

    • Adicionar um certificado de criptografia do token

    • Adicionar um certificado de descriptografia do token

Etapa 1 – Coletar informações de configuração do ACS

Você pode usar o Portal de Gerenciamento do ACS para coletar as informações de configuração necessárias. Para obter mais informações, consulte o Portal de Gerenciamento do ACS.

Para coletar informações de configuração do ACS

  1. Acesse o Portal de Gerenciamento de Microsoft Azure (https://manage.WindowsAzure.com), entre e clique no Active Directory. (Dica de solução de problemas: o item "Active Directory" está ausente ou não está disponível)

  2. Para gerenciar um namespace do Access Control, selecione o namespace e clique em Gerenciar. (Or, clique em Namespaces do Access Control, selecione o namespace e clique em Gerenciar.)

  3. Clique em Serviço de gerenciamento, em ManagementClient e em Senha.

  4. Copie o valor no campo Senha.

  5. Clique em Serviço de Gerenciamento. Obtenha o valor do namespace de serviço e do nome do host ACS. Se a URL do Serviço de Gerenciamento for http://contoso.accesscontrol.windows.net, o namespace será contoso e o nome do host será accesscontrol.windows.net.

Etapa 2 – Criar um exemplo de aplicativo de console

Nesta etapa, você cria um aplicativo de console de exemplo que pode executar o código para adicionar seus grupos de regras e regras do ACS.

Para criar um exemplo de aplicativo de console

  1. Abra Visual Studio 2012 e crie um novo projeto de aplicativo de console no modelo instalado Windows.

  2. Adicione o código a seguir à classe Programa e atribua as variáveis serviceIdentityPasswordForManagement, serviceNamespace e acsHostName às informações de configuração apropriadas que você coletou na etapa anterior.

    public const string serviceIdentityUsernameForManagement = "ManagementClient";
    public const string serviceIdentityPasswordForManagement = "My Password/Key for ManagementClient";
    public const string serviceNamespace = "MyNameSpaceNoDots";
    public const string acsHostName = "accesscontrol.windows.net";
    public const string acsManagementServicesRelativeUrl = "v2/mgmt/service/";
    static string cachedSwtToken;
    

Etapa 3 – Adicionar referências aos serviços e assemblies necessários

Nesta etapa, você identifica e adiciona as dependências necessárias aos serviços e assemblies.

Para adicionar as dependências necessárias aos serviços e assemblies

  1. Clique com o botão direito do mouse em Referências, clique em Adicionar Referência e adicione uma referência a System.Web.Extensions.

    Observação

    Você talvez tenha que clicar com o botão direito do mouse no nome do exemplo de aplicativo de console no Gerenciador de Soluções, selecionar Propriedades e alterar a estrutura de destino de seu exemplo de aplicativo no .NET Framework 4 Client Profile (atribuído por padrão quando você cria um novo aplicativo de console) ao .NET Framework 4.

  2. Clique com o botão direito do mouse em Referências de Serviço, clique em Adicionar Referência de Serviço e adicione uma referência de serviço ao Serviço de Gerenciamento. A URL do Serviço de Gerenciamento é exclusiva para seu namespace e tem uma aparência semelhante a esta:

    https:// YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/service

  3. Adicione as seguintes declarações, onde MyConsoleApplication é o nome de seu aplicativo de console e MyServiceReference é o nome de sua referência de serviço:

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Net;
    using System.Data.Services.Client;
    using System.Collections.Specialized;
    using System.Web.Script.Serialization;
    using System.Globalization;
    using System.Security.Cryptography;
    using System.Security.Cryptography.X509Certificates; 
    using MyConsoleApplication.MyServiceReference;
    

Etapa 4 – Implementar o cliente do Serviço de Gerenciamento

Nesta etapa, você implementa o cliente do Serviço de Gerenciamento.

Para implementar o cliente do Serviço de Gerenciamento

  1. Adicione o seguinte método à classe Programa :

       public static ManagementService CreateManagementServiceClient()
            {
                string managementServiceEndpoint = String.Format(CultureInfo.InvariantCulture, "https://{0}.{1}/{2}",
                    serviceNamespace,
                    acsHostName,
                    acsManagementServicesRelativeUrl);
                ManagementService managementService = new ManagementService(new Uri(managementServiceEndpoint));
    
                managementService.SendingRequest += GetTokenWithWritePermission;
    
                return managementService;
            }
    
  2. Adicione o método GetTokenWithWritePermission e seus métodos auxiliares à classe Programa. GetTokenWithWritePermission e seus auxiliares adicionam o token SWT OAuth ao cabeçalho de autorização da solicitação HTTP.

    public static void GetTokenWithWritePermission(object sender, SendingRequestEventArgs args)
            {
                GetTokenWithWritePermission((HttpWebRequest)args.Request);
            }
    
            public static void GetTokenWithWritePermission(HttpWebRequest args)
            {
                if (cachedSwtToken == null)
                {
                    cachedSwtToken = GetTokenFromACS();
                }
    
                args.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + cachedSwtToken);
            }
    
            private static string GetTokenFromACS()
            {
                //
                // Request a token from ACS
                //
                WebClient client = new WebClient();
                client.BaseAddress = string.Format(CultureInfo.CurrentCulture, 
                                                   "https://{0}.{1}", 
                                                   serviceNamespace, 
                                                   acsHostName);
    
                NameValueCollection values = new NameValueCollection();
                values.Add("grant_type", "client_credentials");
                values.Add("client_id", serviceIdentityUsernameForManagement);
                values.Add("client_secret", serviceIdentityPasswordForManagement);
                values.Add("scope", client.BaseAddress + acsManagementServicesRelativeUrl);
    
                byte[] responseBytes = client.UploadValues("/v2/OAuth2-13", "POST", values);
    
                string response = Encoding.UTF8.GetString(responseBytes);
    
                // Parse the JSON response and return the access token 
                JavaScriptSerializer serializer = new JavaScriptSerializer();
    
                Dictionary<string, object> decodedDictionary = serializer.DeserializeObject(response) as Dictionary<string, object>;
    
                return decodedDictionary["access_token"] as string;
    
            }
    

Etapa 5 – Adicionar certificados e chaves

Adicionar um certificado de assinatura de token para seu namespace Controle de Acesso

Neste exemplo, você cria um certificado de assinatura X.509 para seu namespace Controle de Acesso.

Para adicionar um certificado de assinatura de token para todos os aplicativos de terceira parte confiável no namespace Controle de Acesso

  1. Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Crie uma função auxiliar ReadBytesFromPfxFile para ler bytes do certificado X.509 adicionando o seguinte código à classe Programa :

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] signingCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        signingCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return signingCertificate;
            }
    
  3. Para adicionar um certificado X.509 de assinatura de token, adicione o seguinte código ao método Principal na classe Programa:

    Observação

    Substitua “Caminho completo para o arquivo .PFX” pelo caminho completo válido para o certificado X.509. Por exemplo, “C:\ ACS2ClientCertificate.pfx”.

    Substitua “MyCertificatePassword” pela senha do certificado X.509.

    X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", “MyCertificatePassword”);
    
                DateTime startDate, endDate;
                startDate = cert.NotBefore.ToUniversalTime();
                endDate = cert.NotAfter.ToUniversalTime();
               string pfxFileName = @"Full path to your .PFX file";
                string pfxPassword = @"MyCertificatePassword";
    
    byte[] signingCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
    ServiceKey serviceKey = new ServiceKey()
                {
                    Type = "X509Certificate",
                    Usage = "Signing",
                    Value = signingCertificate,
                      Password = Encoding.UTF8.GetBytes("MyCertificatePassword"),
                      IsPrimary = false,
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    

Adicionar um certificado de assinatura de token para um aplicativo de terceira parte confiável

Neste exemplo, você cria um certificado de assinatura X.509 que é atribuído a um determinado aplicativo de terceira parte confiável.

Como adicionar um certificado de assinatura de token para um aplicativo de terceira parte confiável

  1. Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Crie uma função auxiliar ReadBytesFromPfxFile para ler os bytes de seu certificado X.509 adicionando o código a seguir à classe Programa:

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] signingCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        signingCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return signingCertificate;
            }
    
  3. Para adicionar um certificado X.509 de assinatura de token, adicione o seguinte código ao método Principal na classe Programa:

    Observação

    Substitua “Caminho completo para o arquivo .PFX” pelo caminho completo para o certificado X.509. Por exemplo, “C:\ ACS2ClientCertificate.pfx”.

    Substitua “MyCertificatePassword” pela senha do certificado X.509.

    Substitua “MyRelyingPartyApplication” pelo nome do aplicativo de terceira parte confiável.

    //Select an existing Relying Party Application by its name
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
    
               // Add a signing certificate
    
               X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", "MyCertificatePassword");
               DateTime startDate, endDate;
               startDate = cert.NotBefore.ToUniversalTime();
               endDate = cert.NotAfter.ToUniversalTime();
    
               string pfxFileName = @"Full path to your .PFX file";
               string pfxPassword = "MyCertificatePassword";
    
                byte[] signingCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
               RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
                    StartDate = startDate.ToUniversalTime(),
                   EndDate = endDate.ToUniversalTime(),
                    Type = "X509Certificate",
                    Usage = "Signing",
                    IsPrimary = true,
                    Value = signingCertificate,
                   Password = Encoding.UTF8.GetBytes("MyCertificatePassword")
                };
    
    // Add the new signing certificate to the selected Relying Party Application
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
    
    
                //Save your relying party application
    
                svc.SaveChanges(SaveChangesOptions.Batch);
    

Adicionar uma chave simétrica de assinatura de token para seu namespace Controle de Acesso

Neste exemplo, você atribui essa chave simétrica de assinatura ao namespace Controle de Acesso.

Para adicionar uma chave simétrica de assinatura de token para seu namespace Controle de Acesso

  1. Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Para adicionar uma chave simétrica de assinatura de token, adicione o seguinte código ao método Principal na classe Programa:

           string symKey = "SampleTokenSigningSymmetricKey";
                DateTime startDate, endDate;
                startDate = DateTime.UtcNow;
                endDate = DateTime.MaxValue;
    
                ServiceKey serviceKey = new ServiceKey()
                {
                    
                    Type = "Symmetric",
                    Usage = "Signing",
                    Value = Encoding.UTF8.GetBytes(symKey),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    

Adicionar uma chave simétrica assinatura de token para um aplicativo de terceira parte confiável

Neste exemplo, você pode atribuir a sua nova chave simétrica de assinatura a um determinado aplicativo de terceira parte confiável.

Para adicionar um chave simétrica de assinatura de token para um aplicativo de terceira parte confiável

  1. Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Para adicionar uma chave simétrica de assinatura de token, adicione o seguinte código ao método Principal na classe Programa:

          //Select a relying party application
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
    
               // Create a symmetric key
    
                string symKey = "SampleTokenSigningSymmetricKey";
                DateTime startDate, endDate;
                startDate = DateTime.UtcNow;
                endDate = DateTime.MaxValue;
    
                RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
    
                    Type = "Symmetric",
                    Usage = "Signing",
                    Value = Encoding.UTF8.GetBytes(symKey),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
    
                //Assign this symmetric key to the selected relying party application 
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
                   //Save your symmetric key
    
                svc.SaveChanges(SaveChangesOptions.Batch);        
    

Adicionar um certificado de criptografia do token

Neste exemplo, você adiciona um certificado de criptografia do token X.509 para um determinado aplicativo de terceira parte confiável.

Para adicionar um certificado de criptografia de token para um aplicativo de terceira parte confiável

  1. Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Para adicionar um certificado X.509 de criptografia de token, adicione o seguinte código ao método Principal na classe Programa:

    Observação

    Substitua “Caminho completo para o arquivo .CER” pelo caminho completo para um certificado X.509. Por exemplo, “C:\ ACS2ClientCertificate.cer”.

    Substitua “MyCertificatePassword” pela senha do certificado X.509.

    Substitua “MyRelyingPartyApplication” pelo nome de um aplicativo de terceira parte confiável.

    //Select a relying party application
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
    
               // Add an encryption certificate
    
                X509Certificate2 cert = new X509Certificate2(@"Full path to your .CER file");
                DateTime startDate, endDate; 
                  startDate = cert.NotBefore;
                  endDate = cert.NotAfter;
    
                RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
                    Type = "X509Certificate",
                    Usage = "Encrypting",
                    Value = cert.GetRawCertData(),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
    
                //Assign this encryption certificate to the selected relying party application 
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
                   //Save your encryption certificate
    
                svc.SaveChanges(SaveChangesOptions.Batch);     
    

Adicionar um certificado de descriptografia do token

Neste exemplo, você adicionará um certificado de descriptografia de token X.509 atribuído ao namespace Controle de Acesso.

Para adicionar um certificado de autenticação de token para todos os aplicativos de terceira parte confiável no namespace Controle de Acesso

  1. Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Crie uma função auxiliar ReadBytesFromPfxFile para ler os bytes de seu certificado X.509 adicionando o código a seguir à classe Programa:

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] decryptionCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        decryptionCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return decryptingCertificate;
            }
    
  3. Para adicionar um certificado X.509 de assinatura de token, adicione o seguinte código ao método Principal na classe Programa:

    Observação

    Substituta "Caminho completo do arquivo .PFX" no código abaixo pelo caminho completo válido de seu certificado X.509. Por exemplo, se um certificado chamado ACS2ClientCertificate.pfx for salvo em C:, o valor correto será "C:\ ACS2ClientCertificate.pfx".

    Substitua “SenhaDoMeuCertificado” no código abaixo pela senha correta de seu certificado X.509.

    X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", “MyCertificatePassword”);
    
                DateTime startDate, endDate;
                startDate = cert.NotBefore.ToUniversalTime();
                endDate = cert.NotAfter.ToUniversalTime();
               string pfxFileName = @"Full path to your .PFX file";
                string pfxPassword = @"MyCertificatePassword";
    
    byte[] decryptionCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
    ServiceKey serviceKey = new ServiceKey()
                {
                    Type = "X509Certificate",
                    Usage = "Encrypting",
                    Value = decryptionCertificate,
                      Password = Encoding.UTF8.GetBytes("MyCertificatePassword"),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    

Consulte Também

Conceitos

Instruções do ACS