Compartir a través de


Ejemplo de identidad de servicio

En este ejemplo de identidad de servicio se muestra cómo establecer la identidad de un servicio. En tiempo de diseño, un cliente puede recuperar la identidad mediante los metadatos del servicio y, a continuación, en tiempo de ejecución, el cliente puede autenticar la identidad del servicio. El concepto de identidad de servicio es permitir que un cliente autentique un servicio antes de llamar a cualquiera de sus operaciones, protegiendo así al cliente de llamadas no autenticadas. En una conexión segura, el servicio también autentica las credenciales de un cliente antes de permitir el acceso, pero esto no es el foco de este ejemplo. Consulte los ejemplos de Cliente que muestran la autenticación del servidor.

Nota:

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

En este ejemplo se muestran las siguientes características:

  • Cómo establecer los distintos tipos de identidad en distintos puntos de conexión para un servicio. Cada tipo de identidad tiene diferentes funcionalidades. El tipo de identidad que se va a usar depende del tipo de credenciales de seguridad usadas en la vinculación del punto de conexión.

  • La identidad se puede establecer mediante declaración en la configuración o imperativamente en el código. Normalmente, tanto para el cliente como para el servicio, debe usar la configuración para establecer la identidad.

  • Cómo establecer una identidad personalizada en el cliente. Normalmente, una identidad personalizada es una modificación de un tipo de identidad existente que permite al cliente examinar otra información de reclamación proporcionada en las credenciales del servicio para tomar decisiones de autorización antes de acceder al servicio.

    Nota:

    En este ejemplo se comprueba la identidad de un certificado específico denominado identity.com y la clave RSA contenida en este certificado. Al usar los tipos de identidad de Certificado y RSA en la configuración en el cliente, una manera fácil de obtener estos valores es inspeccionar el WSDL para el servicio donde se serializan estos valores.

En el código de ejemplo siguiente se muestra cómo configurar la identidad de un punto de conexión de servicio con el servidor de nombres de dominio (DNS) de un certificado mediante WSHttpBinding.

//Create a service endpoint and set its identity to the certificate's DNS
WSHttpBinding wsAnonbinding = new WSHttpBinding (SecurityMode.Message);
// Client are Anonymous to the service
wsAnonbinding.Security.Message.ClientCredentialType = MessageCredentialType.None;
WServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(ICalculator),wsAnonbinding, String.Empty);
EndpointAddress epa = new EndpointAddress(dnsrelativeAddress,EndpointIdentity.CreateDnsIdentity("identity.com"));
ep.Address = epa;

La identidad también se puede especificar en la configuración del archivo App.config. En el ejemplo siguiente se muestra cómo configurar la identidad upn (nombre principal de usuario) para un punto de conexión de servicio.

<endpoint address="upnidentity"
        behaviorConfiguration=""
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_Windows"
        name="WSHttpBinding_ICalculator_Windows"
        contract="Microsoft.ServiceModel.Samples.ICalculator">
  <!-- Set the UPN identity for this endpoint -->
  <identity>
      <userPrincipalName value="host\myservice.com" />
  </identity >
</endpoint>

Se puede establecer una identidad personalizada en el cliente derivando de las EndpointIdentity clases y IdentityVerifier . Conceptualmente, la IdentityVerifier clase se puede considerar como el equivalente del cliente de la clase del AuthorizationManager servicio. En el ejemplo de código siguiente se muestra una implementación de OrgEndpointIdentity, que almacena un nombre de organización para que coincida con el nombre del firmante del certificado del servidor. La comprobación de autorización del nombre de la organización se produce en el CheckAccess método de la CustomIdentityVerifier clase .

// This custom EndpointIdentity stores an organization name
public class OrgEndpointIdentity : EndpointIdentity
{
    private string orgClaim;
    public OrgEndpointIdentity(string orgName)
    {
        orgClaim = orgName;
    }
    public string OrganizationClaim
    {
        get { return orgClaim; }
        set { orgClaim = value; }
    }
}

//This custom IdentityVerifier uses the supplied OrgEndpointIdentity to
//check that X.509 certificate's distinguished name claim contains
//the organization name e.g. the string value "O=Contoso"
class CustomIdentityVerifier : IdentityVerifier
{
    public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
    {
        bool returnvalue = false;
        foreach (ClaimSet claimset in authContext.ClaimSets)
        {
            foreach (Claim claim in claimset)
            {
                if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
                {
                    X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
                    if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
                    {
                        Console.WriteLine("Claim Type: {0}",claim.ClaimType);
                        Console.WriteLine("Right: {0}", claim.Right);
                        Console.WriteLine("Resource: {0}",claim.Resource);
                        Console.WriteLine();
                        returnvalue = true;
                    }
                }
            }
        }
        return returnvalue;
    }
}

En este ejemplo se usa un certificado denominado identity.com que se encuentra en la carpeta de la solución Identity específica del lenguaje.

Para configurar, compilar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.

  2. Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.

  3. Para ejecutar el ejemplo en una configuración de un solo equipo o entre equipos, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation.

Para ejecutar el ejemplo en el mismo equipo

  1. En Windows XP o Windows Vista, importe el archivo de certificado Identity.pfx de la carpeta de la solución de identidad al almacén de certificados LocalMachine/My (Personal) con el complemento MMC. Este archivo está protegido con contraseña. Durante la importación se le solicita una contraseña. Escriba xyz en el cuadro contraseña. Para obtener más información, vea el tema How to: View Certificates with the MMC Snap-in (Cómo: Ver certificados con el complemento MMC ). Una vez hecho esto, ejecute el archivo Setup.bat desde el Símbolo del sistema para desarrolladores de Visual Studio con privilegios de administrador. De este modo, este certificado se copiará en el almacén CurrentUser/Trusted People para usarlo en el cliente.

  2. En Windows Server 2003, abra un símbolo del sistema de Visual Studio con privilegios de administrador y ejecute Setup.bat desde la carpeta de instalación del ejemplo. Esto instala todos los certificados necesarios para ejecutar el ejemplo.

    Nota:

    El archivo por lotes Setup.bat está diseñado para ejecutarse desde el símbolo del sistema de Visual Studio. La variable de entorno PATH configurada en la consola de comandos de Visual Studio apunta al directorio que contiene los ejecutables necesarios para el script de Setup.bat. Asegúrese de quitar los certificados ejecutando Cleanup.bat cuando haya terminado con el ejemplo. Otros ejemplos de seguridad usan los mismos certificados.

  3. Inicie Service.exe desde el directorio \service\bin. Asegúrese de que el servicio indica que está listo y muestra un mensaje para presionar <Entrar> para finalizar el servicio.

  4. Inicie Client.exe desde el directorio \client\bin o presione F5 en Visual Studio para compilar y ejecutar. La actividad de cliente se muestra en la aplicación de consola cliente.

  5. Si el cliente y el servicio no pueden comunicarse, consulte Sugerencias de solución de problemas para ejemplos de WCF.

Para ejecutar el ejemplo entre equipos

  1. Antes de compilar la parte del cliente del ejemplo, asegúrese de cambiar el valor de la dirección del punto de conexión del servicio en el archivo Client.cs dentro del método CallServiceCustomClientIdentity. A continuación, compile el ejemplo.

  2. Cree un directorio en el equipo de servicio.

  3. Copie los archivos de programa de servicio de service\bin en el directorio del equipo de servicio. Copie también los archivos Setup.bat y Cleanup.bat en el equipo de servicio.

  4. Cree un directorio en el equipo cliente para los archivos binarios del cliente.

  5. Copie los archivos de programa cliente en el directorio cliente del equipo cliente. Copie también los archivos Setup.bat, Cleanup.baty ImportServiceCert.bat en el cliente.

  6. En el servicio, ejecute setup.bat service en el Símbolo del sistema para desarrolladores de Visual Studio con privilegios de administrador. La ejecución de setup.bat con el argumento service crea un certificado de servicio con el nombre de dominio completo del equipo y exporta el certificado de servicio a un archivo denominado Service.cer.

  7. Copie el archivo Service.cer del directorio de servicio en el directorio cliente del equipo cliente.

  8. En el archivo Client.exe.config del equipo cliente, cambie el valor de dirección del punto de conexión para que coincida con la nueva dirección del servicio. Hay varias instancias que se deben cambiar.

  9. En el cliente, ejecute ImportServiceCert.bat desde el Símbolo del sistema para desarrolladores de Visual Studio con privilegios de administrador. Así se importa el certificado del servicio del archivo Service.cer en el almacén CurrentUser - TrustedPeople.

  10. En el equipo del servicio, inicie el archivo Service.exe desde el símbolo del sistema.

  11. En el equipo cliente, inicie Client.exe desde un símbolo del sistema. Si el cliente y el servicio no pueden comunicarse, consulte Sugerencias de solución de problemas para ejemplos de WCF.

Para limpiar después de la muestra.

  • Ejecute Cleanup.bat en la carpeta samples una vez que haya terminado de ejecutar el ejemplo.

    Nota:

    Este script no quita certificados de servicio en un cliente al ejecutar este ejemplo entre equipos. Si ha ejecutado ejemplos de Windows Communication Foundation (WCF) que usan certificados entre equipos, asegúrese de borrar los certificados de servicio que se han instalado en el almacén CurrentUser - TrustedPeople. Para ello, use el siguiente comando: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Por ejemplo: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.