Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En el ejemplo Anónimo de seguridad de mensajes se muestra cómo implementar una aplicación de Windows Communication Foundation (WCF) que usa seguridad de nivel de mensaje sin autenticación de cliente, pero que requiere autenticación de servidor mediante el certificado X.509 del servidor. Todos los mensajes de aplicación entre el cliente y el servidor están firmados y cifrados. Este ejemplo se basa en el ejemplo WSHttpBinding . Este ejemplo consta de un programa de consola de cliente (.exe) y una biblioteca de servicios (.dll) hospedada por Internet Information Services (IIS). El servicio implementa un contrato que define un patrón de comunicación de solicitud-respuesta.
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 agrega una nueva operación a la interfaz de calculadora que devuelve True si el cliente no se ha autenticado.
public class CalculatorService : ICalculator
{
public bool IsCallerAnonymous()
{
// ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
return ServiceSecurityContext.Current.IsAnonymous;
}
...
}
El servicio expone un único punto de conexión para comunicarse con el servicio, definido mediante un archivo de configuración (Web.config). El punto de conexión está compuesto por una dirección, un enlace y un contrato. El enlace se configura con un enlace wsHttpBinding. El modo de seguridad predeterminado para el wsHttpBinding enlace es Message. El clientCredentialType atributo se establece en None.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!-- This configuration defines the security mode as Message and -->
<!-- the clientCredentialType as None. This mode provides -->
<!-- server authentication only using the service certificate. -->
<binding>
<security mode="Message">
<message clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
Las credenciales que se usarán para la autenticación de servicio se especifican en el <comportamiento>. El certificado de servidor debe contener el mismo valor para el SubjectName que el valor especificado para el findValue atributo, como se muestra en el código de ejemplo siguiente.
<behaviors>
<serviceBehaviors>
<behavior>
<!--
The serviceCredentials behavior allows you to define a service certificate.
A service certificate is used by a client to authenticate the service and provide message protection.
This configuration references the "localhost" certificate installed during the setup instructions.
-->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
</serviceCredentials>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
La configuración del punto de conexión de cliente consta de una dirección absoluta para el punto de conexión de servicio, el enlace y el contrato. El modo de seguridad de cliente para el wsHttpBinding enlace es Message. El clientCredentialType atributo se establece en None.
<system.serviceModel>
<client>
<endpoint name=""
address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
behaviorConfiguration="ClientCredentialsBehavior"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<!--This configuration defines the security mode as -->
<!--Message and the clientCredentialType as None. -->
<binding name="Binding1">
<security mode = "Message">
<message clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
El ejemplo establece CertificateValidationMode en PeerOrChainTrust para autenticar el certificado del servicio. Esto se hace en el archivo App.config del cliente en la behaviors sección . Esto significa que si el certificado está en el almacén de personas de confianza del usuario, se considera confiable sin realizar una validación de la cadena de emisión del certificado. Esta configuración se usa aquí para mayor comodidad para que el ejemplo se pueda ejecutar sin requerir certificados emitidos por una entidad de certificación (CA). Esta configuración es menos segura que la predeterminada, ChainTrust. Las implicaciones de seguridad de esta configuración deben tenerse en cuenta cuidadosamente antes de usarlas PeerOrChainTrust en el código de producción.
La implementación del cliente agrega una llamada al IsCallerAnonymous método y, de lo contrario, no difiere del ejemplo WSHttpBinding .
// Create a client with a client endpoint configuration.
CalculatorClient client = new CalculatorClient();
// Call the GetCallerIdentity operation.
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
Al ejecutar el ejemplo, las solicitudes de operación y las respuestas se muestran en la ventana de la consola del cliente. Presione ENTRAR en la ventana del cliente para apagar el cliente.
IsCallerAnonymous returned: True
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.
El Setup.bat archivo por lotes incluido con el ejemplo Anónimo de seguridad de mensajes permite configurar el servidor con un certificado pertinente para ejecutar una aplicación hospedada que requiera seguridad basada en certificados. El archivo por lotes se puede ejecutar en dos modos. Para ejecutar el archivo por lotes en el modo de equipo único, escriba setup.bat en la línea de comandos. Para ejecutarlo en modo de servicio, escriba setup.bat service. Use este modo al ejecutar el ejemplo entre equipos. Consulte el procedimiento de instalación al final de este tema para obtener más información.
A continuación se proporciona una breve introducción a las distintas secciones de los archivos por lotes:
Creación del certificado de servidor.
Las líneas siguientes del archivo por lotes de Setup.bat crean el certificado de servidor que se va a usar.
echo ************ echo Server cert setup starting echo %SERVER_NAME% echo ************ echo making server cert echo ************ makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -peLa variable %SERVER_NAME% especifica el nombre del servidor. El certificado se almacena en el almacén localMachine. Si el archivo por lotes de instalación se ejecuta con un argumento de servicio (como
setup.bat service) el %SERVER_NAME% contiene el nombre de dominio completo del equipo. De lo contrario, el valor predeterminado es localhost.Instalar el certificado de servidor en el almacén de certificados de confianza del cliente.
La línea siguiente copia el certificado de servidor en el almacén de personas de confianza del cliente. Este paso es necesario porque el sistema cliente no confía implícitamente en los certificados generados por Makecert.exe. Si ya tiene un certificado que se basa en un certificado raíz de confianza de cliente (por ejemplo, un certificado emitido por Microsoft), este paso para rellenar el almacén de certificados de cliente con el certificado de servidor no es necesario.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeopleConceder permisos en la clave privada del certificado.
Las siguientes líneas del archivo por lotes Setup.bat permiten que el certificado de servidor almacenado en el almacén LocalMachine sea accesible a la cuenta del proceso de trabajo de ASP.NET.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%MSSDK%\bin\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr "5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisreset
Nota:
Si está utilizando una edición de Windows en inglés que no sea de EE. UU., debe editar el archivo Setup.bat y reemplazar el nombre de la cuenta NT AUTHORITY\NETWORK SERVICE por su equivalente regional.
Para configurar, compilar y ejecutar el ejemplo
Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.
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.
Para ejecutar el ejemplo en el mismo equipo
Asegúrese de que la ruta de acceso incluye la carpeta donde se encuentran Makecert.exe y FindPrivateKey.exe.
Ejecute el archivo Setup.bat de la carpeta de instalación del ejemplo en un Símbolo del sistema para desarrolladores de Visual Studio que se ejecuta con privilegios de administrador. 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 para desarrolladores de Visual Studio. Requiere que la variable de entorno path apunte al directorio donde está instalado el SDK. Esta variable de entorno se establece automáticamente en el Símbolo del sistema para desarrolladores de Visual Studio.
Para comprobar el acceso al servicio mediante un explorador, escriba la dirección
http://localhost/servicemodelsamples/service.svc.Inicie Client.exe desde \client\bin. La actividad de cliente se muestra en la aplicación de consola cliente.
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
Cree un directorio en el equipo de servicio. Cree una aplicación virtual denominada servicemodelsamples para este directorio mediante la herramienta de administración de Internet Information Services (IIS).
Copie los archivos de programa de servicio de \inetpub\wwwroot\servicemodelsamples en el directorio virtual del equipo de servicio. Asegúrese de copiar los archivos en el subdirectorio \bin. Copie también los archivos Setup.bat y Cleanup.bat en el equipo de servicio.
Cree un directorio en el equipo cliente para los archivos binarios del cliente.
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.
En el servidor, ejecute
setup.bat serviceen un Símbolo del sistema para desarrolladores de Visual Studio con privilegios de administrador. La ejecución desetup.batcon el argumentoservicecrea un certificado de servicio con el nombre de dominio completo del equipo y exporta el certificado de servicio a un archivo denominado Service.cer.Modifique el archivo Web.config para reflejar el nuevo nombre del certificado (en el atributo
findValuede <serviceCertificate>), que es igual que el nombre de dominio completo del equipo.Copie el archivo Service.cer del directorio de servicio en el directorio cliente del equipo cliente.
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.
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.
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: Por ejemplo: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.