Compartilhar via


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

Atualizado: June 19, 2015

Aplica-se a: Azure

Aplica-se a

  • Controle de Acesso do Microsoft Azure Active Directory (também conhecido como Serviço de Controle de Acesso ou ACS)

Visão geral

Você pode configurar certificados e chaves do ACS usando o Portal de Gerenciamento do ACS ou o Serviço de Gerenciamento do ACS. Trabalhar com o Serviço de Gerenciamento ACS pode ser mais eficiente se você estiver criando uma interface do 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 ACS

Importante

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

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

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

  • Etapa 2 – Criar um aplicativo de console de exemplo

  • 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 seu namespace de controle de acesso

    • Adicionar um certificado de autenticação de token para um aplicativo de terceira parte confiável

    • Adicionar uma chave simétrica de assinatura de token para o namespace do Access Control

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

    • Adicionar um certificado de criptografia de token

    • Adicionar um certificado de descriptografia de 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 Portal de Gerenciamento ACS.

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

  1. Vá para o Portal de Gerenciamento do Microsoft Azure (https://manage.WindowsAzure.com), entre e clique em 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. (Ou clique em Namespaces do Access Control, selecione o namespace e clique em Gerenciar.)

  3. Clique em Serviço de gerenciamento, clique em ManagementClient e clique 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 do 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 aplicativo de console de exemplo

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 aplicativo de console de exemplo

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

  2. Adicione o código a seguir à classe Program e atribua as variáveis serviceIdentityPasswordForManagement, serviceNamespace e acsHostName às informações de configuração apropriadas coletadas 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

    Talvez seja necessário clicar com o botão direito do mouse no nome do aplicativo de console de exemplo no Gerenciador de Soluções, selecionar Propriedades e alterar a estrutura de destino do aplicativo de exemplo do Perfil do Cliente do .NET Framework 4 (atribuído por padrão quando você cria um novo aplicativo de console) para o .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 do seu namespace e é semelhante à seguinte:

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

  3. Adicione as seguintes declarações, em que MyConsoleApplication é o nome do aplicativo de console e MyServiceReference é o nome da 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 Program . GetTokenWithWritePermission e seus auxiliares adicionam o token SWT OAuth ao cabeçalho Authorization 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;
    
            }
    

Passo 5 – Adicionar certificados e chaves

Adicionar um certificado de autenticação de token para o namespace do Access Control

Neste exemplo, você cria um certificado de assinatura X.509 para o namespace do Access Control.

Para adicionar um certificado de assinatura de token para todos os aplicativos de terceira parte confiável no namespace do Access Control

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

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

    //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 Main na classe Program :

    Observação

    Substitua "Caminho completo para o seu domínio . 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 autenticação de token para um aplicativo de terceira parte confiável

Neste exemplo, você cria um certificado de autenticação X.509 que é atribuído a um aplicativo de terceira parte confiável específico.

Como adicionar um certificado de autenticação 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 Main na classe Program :

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

    //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 Main na classe Program :

    Observação

    Substitua "Caminho completo para o seu domínio . PFX" com o 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 o namespace do Access Control

Neste exemplo, você atribui essa chave simétrica de assinatura ao namespace do Access Control.

Para adicionar uma chave simétrica de assinatura de token para o namespace do Access Control

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

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

           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 de assinatura de token para um aplicativo de terceira parte confiável

Neste exemplo, você atribui sua nova chave simétrica de assinatura a um aplicativo de terceira parte confiável específico.

Para adicionar uma 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 Main na classe Program :

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

          //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 de token

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

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 Main na classe Program :

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

    Observação

    Substitua "Caminho completo para o seu domínio . CER file" com o 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 de token

Neste exemplo, você adiciona um certificado de descriptografia de token X.509 atribuído ao namespace do Access Control.

Para adicionar um certificado de assinatura de token para todos os aplicativos de terceira parte confiável no namespace do Access Control

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

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

    //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 Main na classe Program :

    Observação

    Substitua "Caminho completo para o seu domínio . PFX" no código abaixo com o caminho completo válido para o certificado X.509. Por exemplo, se um certificado chamado ACS2ClientCertificate.pfx for salvo em C:, o valor correto será "C:\ ACS2ClientCertificate.pfx".

    Substitua "MyCertificatePassword" no código abaixo pela senha correta para 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

Como fazer ACS