Cómo: Usar el servicio de administración de ACS para configurar certificados y claves
Actualizado: 19 de junio de 2015
Se aplica a: Azure
Se aplica a
- Active Directory Access Control de Microsoft Azure (también conocido como Access Control Service o ACS)
Información general
Puede configurar certificados y claves de ACS mediante el Portal de administración de ACS o el servicio de administración de ACS. Trabajar con el servicio de administración de ACS puede ser más eficaz si va a crear una interfaz de usuario personalizada para administrar ACS o si desea automatizar la incorporación de un nuevo inquilino para soluciones de software como servicio (SaaS) multiinquilino.
Para obtener más información sobre el uso del Portal de administración de ACS para configurar certificados y claves, consulte Certificados y claves.
Pasos para configurar certificados y claves mediante el Servicio de administración de ACS
Importante
Antes de realizar los pasos siguientes, asegúrese de que el sistema cumple todos los requisitos de .NET Framework y plataforma que se resumen en Requisitos previos de ACS.
Para configurar certificados y claves mediante el servicio de administración de ACS, complete los pasos siguientes:
Paso 1: Recopilación de información de configuración de ACS
Paso 2: Creación de una aplicación de consola de ejemplo
Paso 3: Agregar referencias a los servicios y ensamblados necesarios
Paso 4: Implementar el cliente del servicio de administración
Paso 5: Instalación de certificados y claves
Agregar un certificado de firma de tokens para el espacio de nombres del Control de acceso
Agregar un certificado de firma de tokens para una aplicación de usuario de confianza
Agregar una clave simétrica de firma de tokens para el espacio de nombres del Control de acceso
Agregar una clave simétrica de firma de tokens para una aplicación de usuario de confianza
Agregar un certificado de cifrado de tokens
Agregar un certificado de descifrado de tokens
Paso 1: Recopilación de información de configuración de ACS
Puede usar el Portal de administración de ACS para recopilar la información de configuración necesaria. Para obtener más información, consulte Portal de administración de ACS.
Para recopilar la información de configuración de ACS
Vaya al Portal de administración de Microsoft Azure (https://manage.WindowsAzure.com), inicie sesión y, a continuación, haga clic en Active Directory. (Sugerencia de solución de problemas: falta el elemento "Active Directory" o no está disponible)
Para administrar el espacio de nombres Access Control, seleccione el espacio de nombres y, a continuación, haga clic en Administrar. (O haga clic en espacios de nombres Access Control, seleccione el espacio de nombres y, a continuación, haga clic en Administrar.)
Haga clic en elServicio de administración, en ManagementClienty, a continuación, en Contraseña.
Copie el valor del campo Contraseña.
Haga clic en Servicio de administración. Obtenga el valor del espacio de nombres del servicio y el nombre de host de ACS. Si la dirección URL del servicio de administración es http://contoso.accesscontrol.windows.net, el espacio de nombres es contoso y el nombre de host se accesscontrol.windows.net.
Paso 2: Creación de una aplicación de consola de ejemplo
En este paso, creará una aplicación de consola de ejemplo que puede ejecutar el código para agregar los grupos de reglas y reglas de ACS.
Para crear una aplicación de consola de ejemplo
Abra Visual Studio 2012 y cree un nuevo proyecto de aplicación de consola en la plantilla Windows instalada.
Agregue el código siguiente a la clase Program y luego asigne las variables serviceIdentityPasswordForManagement, serviceNamespace y acsHostName a la información de configuración correspondiente que recopiló en el paso 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;
Paso 3: Agregar referencias a los servicios y ensamblados necesarios
En este paso, deberá identificar y agregar las dependencias necesarias de los servicios y ensamblados.
Para agregar las dependencias necesarias a los servicios y ensamblados
Haga clic con el botón secundario en Referencias, haga clic en Agregar referencia y agregue una referencia a System.Web.Extensions.
Nota
Es posible que tenga que hacer clic con el botón secundario en el nombre de la aplicación de consola de ejemplo en el Explorador de soluciones, seleccionar Propiedades y cambiar el marco de destino de su aplicación de ejemplo del Perfil de cliente de .NET Framework 4 (asignado de forma predeterminada al crear una nueva aplicación de consola) a .NET Framework 4.
Haga clic con el botón secundario en Referencias al servicio, haga clic en Agregar referencia de servicio y agregue una referencia de servicio al Servicio de administración. La dirección URL del servicio de administración es única a su espacio de nombres y es similar a la siguiente:
https:// YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/service
Agregue las declaraciones siguientes, donde MyConsoleApplication corresponde al nombre de la aplicación de consola y MyServiceReference es el nombre de su referencia de servicio:
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;
Paso 4: Implementar el cliente del servicio de administración
En este paso se implementa el cliente del servicio de administración.
Para implementar el cliente de servicio de administración
Agregue el método siguiente a la clase Program :
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; }
Agregue el método GetTokenWithWritePermission y sus métodos del asistente a la clase Program. El método GetTokenWithWritePermission y sus asistentes agregan el token SWT OAuth al encabezado Authorization de la solicitud 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; }
Paso 5: Agregar certificados y claves
Agregar un certificado de firma de tokens para el espacio de nombres Access Control
En este ejemplo, creará un certificado de firma X.509 para el espacio de nombres Access Control.
Para agregar un certificado de firma de tokens para todas las aplicaciones de usuario de confianza en el espacio de nombres Access Control
Inicie el cliente del servicio de administración. Para ello, agregue el código siguiente al método Main de la clase Program:
ManagementService svc = CreateManagementServiceClient();
Cree una función auxiliar ReadBytesFromPfxFile para leer bytes del certificado X.509 agregando el código siguiente a la clase 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; }
Para agregar un certificado X.509 de firma, agregue el código siguiente al método Main de la clase Program:
Nota
Reemplace “Ruta de acceso completa a su archivo .PFX” con la ruta de acceso completa válida a un certificado X.509. Por ejemplo, "C:\ ACS2ClientCertificate.pfx".
Reemplace "MyCertificatePassword" con la contraseña para el 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);
Agregar un certificado de firma de tokens para una aplicación de usuario de confianza
En este ejemplo, se crea un certificado de firma X.509 que se asigna a una determinada aplicación de usuario de confianza.
Cómo agregar un certificado de firma de tokens para una aplicación de usuario de confianza
Inicie el cliente del servicio de administración. Para ello, agregue el código siguiente al método Main de la clase Program:
ManagementService svc = CreateManagementServiceClient();
Cree una función del asistente ReadBytesFromPfxFile para leer los bytes de su certificado X.509. Para ello, agregue el código siguiente a la clase 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; }
Para agregar un certificado X.509 de firma, agregue el código siguiente al método Main de la clase Program:
Nota
Reemplace “Ruta de acceso completa a su archivo .PFX” con la ruta de acceso completa a un certificado X.509. Por ejemplo, "C:\ ACS2ClientCertificate.pfx".
Reemplace "MyCertificatePassword" con la contraseña para el certificado X.509. Reemplace "MyRelyingPartyApplication" con el nombre de la aplicación de usuario de confianza.//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);
Agregar una clave simétrica de firma de tokens para el espacio de nombres Access Control
En este ejemplo, asignará esta clave simétrica de firma al espacio de nombres Access Control.
Para agregar una clave simétrica de firma de tokens para el espacio de nombres Access Control
Inicie el cliente del servicio de administración. Para ello, agregue el código siguiente al método Main de la clase Program:
ManagementService svc = CreateManagementServiceClient();
Para agregar una clave simétrica de firma de tokens, agregue el código siguiente al método Main de la clase 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);
Agregar una clave simétrica de firma de tokens para una aplicación de usuario de confianza
En este ejemplo, se asigna la nueva clave simétrica de firma a una determinada aplicación de usuario de confianza.
Para agregar una clave simétrica de firma de tokens para una aplicación de usuario de confianza
Inicie el cliente del servicio de administración. Para ello, agregue el código siguiente al método Main de la clase Program:
ManagementService svc = CreateManagementServiceClient();
Para agregar una clave simétrica de firma de tokens, agregue el código siguiente al método Main de la clase 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);
Agregar un certificado de cifrado de tokens
En este ejemplo, se agrega un certificado de cifrado de tokens X.509 para una determinada aplicación de usuario de confianza.
Para agregar un certificado de cifrado de tokens para una aplicación de usuario de confianza.
Inicie el cliente del servicio de administración. Para ello, agregue el código siguiente al método Main de la clase Program:
ManagementService svc = CreateManagementServiceClient();
Para agregar un certificado X.509 de cifrado de tokens, agregue el código siguiente al método Main de la clase Program:
Nota
Reemplace “Ruta de acceso completa a su archivo .CER” con la ruta de acceso completa a un certificado X.509. Por ejemplo, "C:\ ACS2ClientCertificate.cer".
Reemplace “MyCertificatePassword” con la contraseña para el certificado X.509. Reemplace “MyRelyingPartyApplication” con el nombre de una aplicación de usuario de confianza.//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);
Agregar un certificado de descifrado de tokens
En este ejemplo, agregará un certificado de descifrado de tokens X.509 asignado al espacio de nombres Access Control.
Para agregar un certificado de firma de tokens para todas las aplicaciones de usuario autenticado en el espacio de nombres Access Control
Inicie el cliente del servicio de administración. Para ello, agregue el código siguiente al método Main de la clase Program:
ManagementService svc = CreateManagementServiceClient();
Cree una función del asistente ReadBytesFromPfxFile para leer los bytes de su certificado X.509. Para ello, agregue el código siguiente a la clase 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; }
Para agregar un certificado X.509 de firma, agregue el código siguiente al método Main de la clase Program:
Nota
Sustituya la cadena "Full path to your .PFX file" del código con la ruta de acceso completa válida de su certificado X.509. Por ejemplo, si se guarda un certificado llamado ACS2ClientCertificate.pfx en C:, el valor correcto es "C:\ ACS2ClientCertificate.pfx".
Sustituya la cadena “MyCertificatePassword” del código con la contraseña correcta del 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);