Utilizar CardSpace con wsHttpBinding

Download sample

Este ejemplo muestra cómo configurar un wsHttpBindingpara utilizar unCardSpace en un servicio web.

Nota

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

El ejemplo define un contrato ISecureCalculator para mostrar el uso de demandas de identidad personales representado por CardSpace. CalculatorService define e implementa un contrato de servicios denominado ISecureCalculator como se muestra en el código muestra siguiente:

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ISecureCalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
    [OperationContract]
    string GetIdentity();
}

El servicio se configura para requerir un token de SAML proporcionado por CardSpace.

La implementación del servicio de la operación GetIdentity extrae la notificación de Private-Personal-Identifier (PPID) y la devuelve en la respuesta. PrivatePersonalIdentifier es una constante única con una característica de privacidad integrada generada por el emisor del token. El servicio puede utilizar este identificador para la búsqueda de la cuenta y autenticación, junto con otra información como la firma de emisor, y otras notificaciones. El PPID varía de un servicio a otro, aun cuando la misma tarjeta está seleccionada.

const string ppidClaimType = 
"https://schemas.xmlsoap.org/ws/2005/05/identity/claims/ privatepersonalidentifier"; 
public string GetIdentity()
{
 string identity=String.Empty;

 AuthorizationContext ctx = OperationContext.Current.ServiceSecurityContext.AuthorizationContext;

 foreach (ClaimSet claimSet in ctx.ClaimSets)
 {
    foreach (Claim claim in claimSet.FindClaims(ppidClaimType, null))
    {
        identity += claim.Resource as string; 
    }
 }

    return identity;
}

El servicio expone un extremo único, definido en el archivo de configuración (Web.config), que requiere CardSpace de los solicitantes, como se muestra en la configuración del ejemplo siguiente:

   <services>
      <service 
       name="Microsoft.ServiceModel.Samples.CalculatorService" 
       behaviorConfiguration="ServiceCredentials">
        <!-- This endpoint is exposed at the base address provided by host: https://localhost/servicemodelsamples/service.svc  -->
        <endpoint address=""
         binding="wsHttpBinding"
         bindingConfiguration="requireInfoCard"
         contract="Microsoft.ServiceModel.Samples.ISecureCalculator" >
          <identity>
            <certificateReference 
             findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50" 
             x509FindType="FindByThumbprint" 
             storeLocation="LocalMachine" 
             storeName="My" />
          </identity>
        </endpoint>
        <!-- The mex endpoint is exposed at https://localhost/servicemodelsamples/service.svc/mex. -->
        <endpoint address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <wsHttpBinding>
        <binding name="requireInfoCard">
          <security mode="Message">
            <message clientCredentialType="IssuedToken" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

El servicio también configura un comportamiento para especificar el certificado del servicio, que es utilizado por el cliente para autenticar el servicio y los mensajes seguros enviados al servicio.

    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceCredentials">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceCredentials>
            <serviceCertificate
             findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50"
             x509FindType="FindByThumbprint"
             storeLocation="LocalMachine"
             storeName="My" />
            <issuedTokenAuthentication allowUntrustedRsaIssuers="true" />
          </serviceCredentials>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

El cliente también se configura para requerir un token de SAML proporcionado por CardSpace, que produce que la interfaz de usuario CardSpace se inicie al realizar la primera solicitud al servicio. El usuario puede seleccionar una tarjeta de información adecuada para presentar al servicio. Después de seleccionar una tarjeta de la información, la solicitud se protege utilizando un token de SAML que representa la identidad. La operación GetIdentity en el contrato ISecureCalculator extrae la notificación PrivatePersonalIdentifer que se proporcionó en el token de SAML y lo devuelve al llamador.

El cliente comunica con el servicio utilizando una clase de cliente especificadaWCF generada por Service Metadata Utility Tool (Svcutil.exe). El archivo GeneratedProxy.cs contiene la clase de cliente Windows Communication Foundation (WCF) especificada.

La configuración para el cliente también se puede generar utilizando Service Metadata Utility Tool (Svcutil.exe). Service Metadata Utility Tool (Svcutil.exe) crea la configuración de extremo de cliente basada en los metadatos publicados por el servicio. En este ejemplo, la configuración del cliente se crea manualmente iniciándose con la configuración de servicio.

Se exige al cliente establecer clientCredentialType para IssuedToken y configurar certificateReference para permitir a CardSpace autenticar el servicio, como se muestra en la configuración del ejemplo siguiente:

    <client>
      <endpoint
       address="https://localhost/ServiceModelSamples/service.svc/"
       bindingConfiguration="requireInfoCard" 
       binding="wsHttpBinding"
       contract="Microsoft.ServiceModel.Samples.ISecureCalculator"
       behaviorConfiguration="ClientCredentials">
        <identity>
          <certificateReference
           findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50" 
           x509FindType="FindByThumbprint"
           storeLocation="CurrentUser" 
           storeName="TrustedPeople" />
        </identity>
      </endpoint>
    </client>

    <bindings>
      <wsHttpBinding>
        <binding name="requireInfoCard">
          <security mode="Message">
            <message clientCredentialType="IssuedToken" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

Además de proporcionar el certificado del servicio en el extremo, el cliente debe especificar los certificados de los servicios en los que confía. Esto se logra definiendo un comportamiento para hacer referencia a los certificados en el almacén de certificados en el que el cliente confía.

    <behaviors>
      <endpointBehaviors>
        <behavior name="ClientCredentials" 
         includeExceptionDetailInFaults="true">
          <clientCredentials>
            <serviceCertificate>
              <defaultCertificate
               findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50"
               x509FindType="FindByThumbprint"
               storeLocation="CurrentUser"
               storeName="TrustedPeople" />
              <!-- 
            Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate 
            is in the user's Trusted People store, then it will be trusted without performing a
            validation of the certificate's issuer chain. This setting is used here for convenience so that the 
            sample can be run without having to have certificates issued by a certificate authority (CA).
            This setting is less secure than the default, ChainTrust. The security implications of this 
            setting should be carefully considered before using PeerOrChainTrust in production code. 
            -->
              <authentication
               revocationMode="NoCheck"
               certificateValidationMode="PeerOrChainTrust" />
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>

Al ejecutar ese cliente y presionar ENTRAR, el cliente llama a la operación GetIdentity y la interfaz de usuario CardSpace se inicia.

  • Seleccione una tarjeta ya existente de CardSpace o cree una nueva tarjeta

  • Envíe la tarjeta haciendo clic en Enviar.

La notificación o notificaciones en CardSpace se envían al servicio como una serialización de token de SAML de CardSpace. La operación de servicio GetIdentityresponde con la notificación que se extrajo del token de SAML. El cliente llama a continuación las operaciones de la calculadora del servicio y las respuestas se muestran en la ventana de la consola.

Identity - (Private Personal ID) =  LGGjXshcVQE1kFMnxccopDBGvYu6gVs2Aexx+4bMlbk=

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

Para configurar, generar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado el Procedimiento de instalación único para ejemplos de Windows Communication Foundation.

  2. Para ejecutar el ejemplo en una configuración de equipos única o cruzada, utilice las instrucciones siguientes. En particular, ejecute Setup.bat desde el directorio específico del lenguaje bajo el directorio de instalación del ejemplo.

    Nota

    El archivo por lotes Setup.bat está diseñado para ejecutarse desde el símbolo del sistema de Windows SDK. Requiere que el punto de variable de entorno de MSSDK apunte al directorio donde está instalado el SDK. Esta variable de entorno se establece automáticamente dentro de un símbolo del sistema de Windows SDK. Para Windows Vista, asegúrese de que el soporte de compatibilidad de IIS 6.0 está instalado con IIS 7.0.

  3. Para generar el código C#, o la edición Visual Basic de la solución, siga las instrucciones de Generación de ejemplos de Windows Communication Foundation.

  4. Al terminar con el ejemplo, ejecute Cleanup.bat. desde el directorio específico del lenguaje bajo el directorio de instalación del ejemplo.

Para ejecutar el ejemplo en el mismo equipo

  1. Importe el certificado Simple\SampleResources\Fabrikam-Contoso.pfx en el almacén de certificados LocalMachine/My (Personal). La contraseña para este certificado es xyz.

    Nota

    No importe el archivo Fabrikam-Contoso-Public.cer en lugar del archivo Fabrikam Contoso.pfx.

  2. Ejecute Setup.bat desde el directorio específico del lenguaje bajo el directorio Simple. Esto instala el certificado Fabrikam-Contoso-Public.cer en el almacén de certificados de CurrentUser/TrustedPeople para el uso por el cliente. También proporciona el permiso de Servicio Web hospedado en IIS para leer la clave privada del certificado de Fabrikam instalada en el paso anterior.

    Nota

    En Windows Vista, importe manualmente el certificado y, a continuación, ejecute Setup.bat. No hacerlo puede producir el error "el conjunto de claves no existe".

    Nota

    Asegúrese de quitar los certificados ejecutando Cleanup.bat cuando termine con los ejemplos CardSpace. Otros ejemplos CardSpaceusan los mismos certificados. El archivo por lotes Setup.bat está diseñado para ejecutarse desde el símbolo del sistema de Windows SDK. Requiere que el punto de variable de entorno de MSSDK señale el directorio donde está instalado el SDK. Esta variable de entorno se establece automáticamente dentro de un símbolo del sistema de Windows SDK.

  3. Genere el archivo de solución del ejemplo Visual Studio CardSpace.sln situado en la carpeta específica del lenguaje en la carpeta Simple .

  4. Para comprobar que el servicio se está ejecutando, abra en la dirección siguiente en un explorador web: https://localhost/servicemodelsamples/service.svc, el cual muestra un resumen del servicio.

  5. Iniciar client.exe desde Simple \<CS, VB>\client\bin.

  6. Si el cliente y el servicio no se pueden comunicar, vea Sugerencias para la solución de problemas.

Para ejecutar el ejemplo en varios equipos

  1. En el servidor que hospeda el servicio web:

    1. Si el directorio de origen del ejemplo aún no existe en el servidor, copie el directorio TechnologySamples\Basic\Binding\WS\CardSpace\Simple en el servidor.

    2. Importe el certificado Simple\SampleResources\Fabrikam-Contoso.pfx en el almacén de certificados LocalMachine/My (Personal). La contraseña para este certificado es xyz.

      Nota

      No importe el archivo Fabrikam-Contoso-Public.cer en lugar del archivo Fabrikam Contoso.pfx.

    3. Ejecute Setup.bat desde el directorio específico del lenguaje bajo el directorio Simple.

      Nota

      Setup.bat instala el certificado requerido por el cliente en CurrentUser/TrustedPeople y copia las imágenes del logotipo en el directorio virtual ServiceModelSamples. Para evitar esto, instale el certificado del servicio, en lugar de ejecutar Setup.bat.

    4. Genere el proyecto Simple\<CS,VB>\service\service.csproj.

    5. Para comprobar que el servicio se está ejecutando, abra la dirección siguiente en un explorador web: https://localhost/servicemodelsamples/service.svc, el cual muestra un resumen del servicio.

      Nota

      Cuando haya terminado de ejecutar el ejemplo en el servidor, ejecute Cleanup.bat desde el directorio específico del lenguaje en la carpeta Simple.

  2. En el equipo que hospeda el cliente:

    1. Si el directorio de origen del ejemplo aún no existe en el equipo, copie el directorio TechnologySamples\Basic\Binding\WS\CardSpace\Simple en el equipo.

    2. Ejecute Setup.bat desde el directorio específico del lenguaje bajo el directorio Simple. No necesita instalar el certificado del servicio contenido en Fabrikam-Contoso.pfx

    3. Genere el proyecto Simple\<CS,VB>\client\client.csproj.

    4. En el archivo client\bin\client.exe.config, cambie la dirección en <endpoint address=" https://localhost/ServiceModelSamples/service.svc" .../> para que coincida con la nueva dirección del servicio web.

  3. Ejecute client\bin\client.exe.

    Nota

    Cuando haya terminado de ejecutar el ejemplo, ejecute Cleanup.bat.

  4. Si el cliente y el servicio no se pueden comunicar, vea Sugerencias para la solución de problemas.

Para limpiar después del ejemplo

  • Desde el directorio específico del lenguaje en el directorio de instalación del ejemplo, ejecute Cleanup.bat.

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.