Cómo: Usar el servicio de administración de ACS para configurar un proveedor de identidades openID

Actualizado: 19 de junio de 2015

Se aplica a: Azure

Se aplica a

  • Microsoft® Azure™ Access Control Service (ACS)

  • OpenID 2.0

Resumen

Este tema describe los pasos básicos necesarios para agregar proveedores de identidades que admitan el protocolo OpenID. Los proveedores de identidades de OpenID se pueden agregar a ACS mediante el servicio de administración. Los proveedores de identidades de OpenID no se pueden agregar mediante el Portal de administración de ACS. En este tema nos referimos a la especificación OpenID 2.0 porque se trata de la versión de especificación que admite ACS.

Contenido

  • Objetivos

  • Información general

  • Resumen de pasos

  • Paso 1: Recopilación de información de configuración

  • Paso 2: Adición de referencias a los ensamblados y servicios requeridos

  • Paso 3: Implementación del cliente del servicio de administración

  • Paso 4: Adición de un proveedor de identidades

Objetivos

  • Identificar la información de configuración y los requisitos previos necesarios.

  • Mostrar los pasos necesarios para agregar un proveedor de identidades de OpenID.

Información general

El servicio de administración es un servicio web que es uno de los componentes clave de ACS. El servicio de administración incluye funciones que están disponibles mediante la interfaz de usuario del Portal de administración. Todas las acciones que se pueden realizar en el Portal de administración también pueden realizarse mediante el servicio de administración. Agregar los proveedores de identidades de OpenID ACS le permite ahorrar en el desarrollo y el mantenimiento del mecanismo de administración de identidades de escala de Internet. Para realizar la tarea de agregar un proveedor de identidades OpenID, escriba el código que sigue los pasos específicos. Este tema describe dichos pasos básicos.

Resumen de pasos

  • Paso 1: Recopilación de información de configuración

  • Paso 2: Adición de referencias a los ensamblados y servicios requeridos

  • Paso 3: Implementación del cliente del servicio de administración

  • Paso 4: Adición de un proveedor de identidades

Paso 1: Recopilación de información de configuración

Este paso identifica y muestra cómo recopilar la información de configuración necesaria. Necesitará recopilar la información siguiente:

  • Nombre de usuario de la identidad del servicio de administración: ManagementClient.

  • Contraseña de la identidad del servicio de administración: para obtener la contraseña de la identidad del servicio de administración:

    1. Inicie sesión en el Portal de administración del Servicio de control de acceso.

    2. En la sección Administración, haga clic en el vínculo Servicio de administración.

    3. En la página Servicio de administración, haga clic en el vínculo ManagementClient (ManagementClient es el nombre de usuario real para el servicio).

    4. En la sección Credenciales, haga clic en el vínculo Clave simétrica o Contraseña. El valor de cada uno de estos vínculos es el mismo. Esta es la contraseña.

  • El espacio de nombres de su servicio

  • Nombre de host de ACS: suele ser accesscontrol.windows.net.

Tras recopilar la información necesaria, siga los pasos siguientes para crear una aplicación de consola de ejemplo que ejecute el código para agregar el proveedor de identidades OpenID:

  1. Abra Visual Studio® 2010 y cree un nuevo proyecto de aplicación de consola.

  2. En la clase Program, asigne la información recopilada a las variables de ámbito del módulo. Para ello, utilice un código similar al siguiente.

        static string serviceIdentityUsernameForManagement = "ManagementClient";
        static string serviceIdentityPasswordForManagement = "...update to your password...";

        static string serviceNamespace = "...update to your namespace...";
        static string acsHostName = "accesscontrol.windows.net";
        static string acsManagementServicesRelativeUrl = "v2/mgmt/service/";

        static string identityProviderName = "My Open ID Identity Provider";

        static string cachedSwtToken;

Paso 2: Adición de referencias a los ensamblados y servicios requeridos

Este paso permite identificar y agregar las dependencias necesarias de los servicios y ensamblados.

Para agregar las dependencias necesarias a los servicios y ensamblados

  1. Agregue una referencia a System.Web.Extensions.

  2. 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

  3. Agregue las declaraciones siguientes.

    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.Runtime.Serialization.Json;
    using ConsoleApplication1.ServiceReference1;
    

Tenga en cuenta la última declaración, ConsoleApplication1.ServiceReference1. Puede variar en su caso si modificó los valores predeterminados al crear la aplicación de consola o al agregar la referencia al servicio de administración.

Paso 3: Implementación del cliente del servicio de administración

Este paso permite crear un método para encapsular la implementación del cliente del servicio de administración.

Para implementar el cliente de servicio de administración

  1. 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;
            }
    
  2. Implemente el método GetTokenWithWritePermission junto con los métodos de su asistente. Se agregará 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 4: Adición de un proveedor de identidades

Este paso permite agregar un proveedor de identidades OpenID mediante el cliente del servicio de administración creado anteriormente.

Para agregar un proveedor de identidades de OpenID

  1. En el método Main, inicie el cliente del servicio de administración.

    ManagementService svc = CreateManagementServiceClient();
    
  2. Agregue su proveedor de identidades como emisor.

                Issuer issuer = new Issuer
                {
                    Name = identityProviderName
                };
                svc.AddToIssuers(issuer);
                svc.SaveChanges(SaveChangesOptions.Batch);
    
  3. Cree un proveedor de identidades.

                var openId = new IdentityProvider
                {
                    DisplayName = identityProviderName,
                    Description = identityProviderName,
                    WebSSOProtocolType = "OpenId",
                    IssuerId = issuer.Id
                };
    
                svc.AddObject("IdentityProviders", openId);
    
  4. Actualice la dirección de inicio de sesión del proveedor de identidades. En este ejercicio usará www.myopenid.com como dirección de inicio de sesión. Otros proveedores de identidades OpenID son, por ejemplo, Google y Yahoo!. Estos disponen de sus propias direcciones de inicio de sesión. https://www.google.com/accounts/o8/ud Son y https://open.login.yahooapis.com/openid/op/auth, respectivamente.

                var openIdAddress = new IdentityProviderAddress
                {
                    Address = "https://www.myopenid.com/server",
                    EndpointType = "SignIn"
                };
    
                svc.AddRelatedObject(openId, "IdentityProviderAddresses", openIdAddress);
                svc.SaveChanges();
    
  5. Ponga el proveedor de identidades a disposición de los usuarios de confianza, excepto el servicio de administración.

                foreach (RelyingParty rp in svc.RelyingParties)
                {
                    // skip the built-in management RP. 
                    if (rp.Name != "AccessControlManagement")
                    {
                        svc.AddToRelyingPartyIdentityProviders(new RelyingPartyIdentityProvider()
                        {
                            IdentityProviderId = openId.Id,
                            RelyingPartyId = rp.Id
                        });
                    }
                }
    
                svc.SaveChanges(SaveChangesOptions.Batch);