Compartir a través de


Autenticación con el canal TCP

Este tema es específico de una tecnología heredada que se mantiene para la compatibilidad con versiones anteriores con aplicaciones existentes y no se recomienda para nuevo desarrollo. Las aplicaciones distribuidas se deberían desarrollar utilizando  Windows Communication Foundation (WCF).

El canal TCP admite directamente autenticación y suplantación. En este tema se describe cómo configurar los canales de servidor y de cliente.

.NET Framework permite a los servidores de objetos remotos autenticar y suplantar a los llamadores estableciendo las propiedades de los TcpServerChannel asociados y los objetos TcpClientChannel.

Configuración del servidor

Para configurar un canal de servidor TCP para autenticar a los llamadores remotos, establezca la propiedad secure a true en los canales TCP tal y como se muestra en el siguiente archivo de configuración.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(es-es,VS.100).gifNota:
La propiedad secure en el canal de cliente también se debe a true para que se produzca la comunicación segura. De forma predeterminada, la comunicación segura incluye la autenticación y el cifrado de datos enviados entre el servidor y el cliente.

Se puede tener acceso a la identidad del cliente autenticado obteniendo CurrentPrincipaly, a continuación, accediendo a su propiedad Identity. Se puede tener acceso a la identidad del cliente suplantado mediante GetCurrent. A continuación, puede llevar a cabo su propia autorización, si se requiere.

Para configurar un canal de servidor TCP para autenticar y suplantar a los llamadores remotos, establezca la propiedad secure y la propiedad impersonate a true tal y como se muestra en el siguiente archivo de configuración.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" impersonate="true" />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(es-es,VS.100).gifNota:
Para que se produzca la suplantación, la propiedad tokenImpersonationLevel del canal de cliente se debe establecer a impersonation o a delegation. Observe que en el servidor la propiedad se denomina impersonate pero en el cliente, usted establece tokenImpersonationLevel a impersonation.

59hafwyt.note(es-es,VS.100).gifNota:
Todos los procesos se ejecutan desde una cuenta de usuario estándar en Windows Vista. Los usuarios estándar no pueden suplantar una cuenta de administrador. Si tiene una aplicación remota que debe suplantar a una cuenta de administrador, esa aplicación se debe ejecutar con privilegios elevados.

La propiedad authorizationModule permite al servidor llevar a cabo su propia autorización. Para utilizar esta propiedad, debe crear una clase que implementa IAuthorizeRemotingConnection. Esta interfaz contiene los siguientes métodos:

  • IsConnectingEndpointAuthorized, que le permite autorizar a un cliente mediante la dirección IP.

  • IsConnectingIdentityAuthorized, que le permite autorizar a un cliente por su identidad.

En el archivo de configuración del servidor establezca la propiedad authorizationModule a la clase que implementa IAuthorizeRemotingConnection en una cadena del formulario "namespace.class, ensamblado" como se muestra en el archivo de configuración siguiente.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.runtime.remoting>
    <application name="AuthorizationApp">
      <service>
        <wellknown mode="SingleCall"
                   type="Server.SampleService, Server"
                   objectUri="Server.rem"/>
      </service>

      <channels>
        <channel ref="tcp" port="8001" secure="true" impersonate="true" authorizationModule="Server.AuthorizationModule,Server"/>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

Configuración del cliente

Para configurar un canal TPC de cliente con el fin de autenticar a un llamador, establezca la propiedad secure en true en el canal TCP tal como se muestra en el siguiente archivo de configuración.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(es-es,VS.100).gifNota:
La propiedad secure del canal de cliente también se debe establecer a true para que se produzca la comunicación segura. De forma predeterminada, la comunicación segura incluye la autenticación y el cifrado de datos enviados entre el servidor y el cliente.

Para configurar un canal TPC de cliente con el fin de utilizar la suplantación, establezca la propiedad secure a true y la propiedad tokenImpersonationLevel a impersonation tal como se muestra en el siguiente archivo de configuración.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" tokenImpersonationLevel="impersonation"/>
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(es-es,VS.100).gifNota:
Para que la suplantación tenga lugar, la propiedad impersonate del canal de servidor se debe establecer a true. Observe que en el servidor la propiedad se denomina impersonate pero en el cliente, tokenImpersonationLevel está establecida a impersonation.

59hafwyt.note(es-es,VS.100).gifNota:
Todos los procesos se ejecutan desde una cuenta de usuario estándar en Windows Vista. Los usuarios estándar no pueden suplantar una cuenta de administrador. Si tiene una aplicación remota que debe suplantar a una cuenta de administrador, esa aplicación se debe ejecutar con privilegios elevados.

El tokenImpersonationLevel se puede configurar a uno de los valores de la tabla siguiente.

Valor de tokenImpersonationLevel Descripción

Identificación

El servidor puede obtener información sobre el cliente, como identificadores de seguridad y privilegios, pero no puede suplantarlo.

Suplantación

El servidor puede suplantar el contexto de seguridad del cliente en su sistema local. El servidor no puede suplantar al cliente en sistemas remotos.

Delegación

El servidor puede suplantar al cliente en sistemas remotos.

De forma predeterminada, un canal de cliente TCP se autentica con la identidad del usuario bajo la que se está ejecutando el proceso de cliente. Puede especificar una identidad alternativa estableciendo las propiedades domain, username y password para que especifiquen una identidad alternativa tal como se muestra en el ejemplo de código siguiente.

RemotingConfiguration.Configure("Client.exe.config", true);
ISharedInterface remoteObject = (ISharedInterface)Activator.GetObject(
                typeof(ISharedInterface),
                "tcp://localhost:8001/server.rem");

// Set domain, username, and password
IDictionary props = ChannelServices.GetChannelSinkProperties(remoteObject);
props["domain"] = "SomeDomain"; // only required if the user is a member of a domain
props["username"] = "SomeRemotingUser";
props["password"] = "Password123";

// Call method on remote object
remoteObject.HelloWorld("Hi Server");

También puede especificar las propiedades domain, username y password en un archivo de configuración.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" 
                       secure="true" 
                       tokenImpersonationLevel="impersonation"
                       username="SomeRemotingUser"
                       password="Password123"
                       />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(es-es,VS.100).gifNota:
No se recomienda la codificación de nombres de usuario y contraseñas en código o en configuración. Solamente se hace aquí para mostrar una ilustración. La mejor forma de obtener credenciales es preguntar al usuario.

De forma predeterminada, los canales TCP utilizan NTLM para autenticar a los llamadores. Para obligar al canal a utilizar Kerberos, establezca la propiedad servicePrincipalName a la cuenta bajo la que se ejecuta el servicio tal como se muestra en el siguiente archivo de configuración.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" tokenImpersonationLevel="impersonation"
                       servicePrincipalName="MyDomain\MyUserAccount"/>
          </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(es-es,VS.100).gifNota:
Kerberos requiere el acceso a un servidor Active Directory. Si los equipos que ejecutan su código no son miembros de un dominio de Active Directory, utilice en su lugar NTLM (el valor predeterminado).

Vea también

Conceptos

Cifrado e integridad de mensaje
Autenticación con el canal HTTP
Autenticación con el canal IPC