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
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)
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.)
Clique em Serviço de gerenciamento, em ManagementClient e em Senha.
Copie o valor no campo Senha.
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
Abra Visual Studio 2012 e crie um novo projeto de aplicativo de console no modelo instalado Windows.
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
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.
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
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
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; }
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
Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:
ManagementService svc = CreateManagementServiceClient();
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; }
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
Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:
ManagementService svc = CreateManagementServiceClient();
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; }
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
Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:
ManagementService svc = CreateManagementServiceClient();
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
Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:
ManagementService svc = CreateManagementServiceClient();
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
Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:
ManagementService svc = CreateManagementServiceClient();
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
Inicialize o cliente do Serviço de Gerenciamento adicionando o seguinte código ao método Principal na classe Programa:
ManagementService svc = CreateManagementServiceClient();
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; }
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);