Federación de CardSpace

Download sample

Este ejemplo muestra cómo configurar un enlace personalizado para utilizar un CardSpace en un Servicio Web.

Nota

Las instrucciones de compilación y el procedimiento de instalació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 una tarjeta de la información. 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 todas las demandas que fueron solicitadas originalmente por el servicio.

public string GetIdentity()
{
    string identity = String.Empty;

    AuthorizationContext ctx = OperationContext.Current.ServiceSecurityContext.AuthorizationContext;
    
    foreach (ClaimSet claimSet in ctx.ClaimSets)
    {
        foreach (Claim claim in claimSet)
        {
            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="wsFederationHttpBinding"
              bindingConfiguration="requireInfoCard"
              contract="Microsoft.ServiceModel.Samples.ISecureCalculator" >
      <identity>
        <certificateReference findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50" 
                              x509FindType="FindByThumbprint" 
                              storeLocation="LocalMachine" 
                              storeName="My" />
      </identity>
    </endpoint>
    <!-- the mex endpoint is explosed at https://localhost/servicemodelsamples/service.svc/mex -->
    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
  </service>
</services>

<bindings>
  <wsFederationHttpBinding>
    <binding name="requireInfoCard">
      <security mode="Message">
        <message issuedTokenType="urn:oasis:names:tc:SAML:1.0:assertion">
          <claimTypeRequirements>
            <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"/>
            <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"/>
            <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"/>
            <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifer"/>
          </claimTypeRequirements>
          <issuer address="https://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self"/>
        </message>
      </security>
    </binding>
  </wsFederationHttpBinding>
</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 la 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 demanda de la Dirección de e-mail que se proporcionó en el token de SAML y la devuelve al llamador.

El cliente comunica con el servicio utilizando una clase de cliente especificadaWindows Communication Foundation (WCF) generada por Service Metadata Utility Tool (Svcutil.exe). El archivo GeneratedClient.cs contiene la clase de cliente 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 configurar certificateReference para permitir alCardSpace autenticar el servicio, como se muestra en la configuración del ejemplo siguiente:

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

    <bindings>
      <wsFederationHttpBinding>
        <binding name="requireInfoCard">
          <security mode="Message">
            <message issuedTokenType="urn:oasis:names:tc:SAML:1.0:assertion">
              <claimTypeRequirements>
                <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"/>
                <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"/>
                <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"/>
                <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier"/>
              </claimTypeRequirements>
              <issuer address="https://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self"/>
            </message>
          </security>
        </binding>
      </wsFederationHttpBinding>
    </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" >
          <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 CardSpacese inicia.

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

  • Envíe la tarjeta haciendo clic en Enviar.

La demanda o demandas en CardSpace se envían al servicio como una serialización de token de SAML de CardSpace. La operación de servico GetIdentityresponde con la demanda 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.

claims requested by the service = [System.Byte[]] [someone@example.com] [Someone] [Example] [IdjUW0O7xWVaga5AODCOuM070Ll9SfsPtYYfo8pKi7s=]
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 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, siga las siguientes instrucciones. 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 la variable de entorno de MSSDK se dirija 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 la admisión de la compatibilidad de IIS 6.0 se instala 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 del directorio específico del lenguaje bajo el directorio de instalación del ejemplo, ejecute Cleanup.bat.

Para ejecutar el ejemplo en el mismo equipo

  1. Importe el certificado <CS, VB>\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 de ejemplo. 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 de IIS-hosted 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. El error para esto 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.

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

  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. Inicie Client.exe desde <CS,VB>\Client\Bin.

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

Para ejecutar el ejemplo en los equipos

  • En el servidor que hospeda el servicio:

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

    2. Importe el certificado <CS, VB>\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. Desde el directorio específico del lenguaje bajo el directorio de ejemplo, ejecute Setup.bat.

      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. El archivo por lotes Setup.bat está diseñado para ejecutarse desde el símbolo del sistema de Windows SDK. Requiere que la variable de entorno de MSSDK se dirija 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.

    4. Genere el proyecto <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 se haya terminado de ejecutar el ejemplo en el servidor, ejecute Cleanup.bat desde el directorio específico del lenguaje en la carpeta de ejemplo.

  1. En el equipo que hospeda el cliente:

    1. Si el directorio de origen del ejemplo aún no existe en el PC, copie el directorio TechnologySamples\Basic\Binding\ws\CardSpace\UsingWsFederation en el PC.

    2. Desde el directorio específico del lenguaje bajo el directorio de ejemplo, ejecute Setup.bat. No necesita instalar el certificado del servicio contenido en el Fabrikam-Contoso.pfx

    3. Genere el proyecto <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 de su servicio.

  2. Ejecute Client\Bin\Client.exe.

Nota

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

  1. Si el cliente y el servicio no se pueden comunicar, consulte 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.