Compartir a través de


Escritura de un cliente SSPI autenticado

Todas las sesiones de cliente/servidor RPC requieren un enlace entre el cliente y el servidor. Para agregar seguridad a las aplicaciones cliente/servidor, los programas deben usar un enlace autenticado. En esta sección se describe el proceso de creación de un enlace autenticado entre el cliente y el servidor.

Para obtener información relacionada, vea Procedimientos usados con la mayoría de los paquetes de seguridad y protocolos en el Kit de desarrollo de software de plataforma (SDK).

Crear identificadores de enlace del lado cliente

Para crear una sesión autenticada con un programa de servidor, las aplicaciones cliente deben proporcionar información de autenticación con su identificador de enlace. Para configurar un identificador de enlace autenticado, los clientes invocan la función RpcBindingSetAuthInfo o RpcBindingSetAuthInfoEx . Estas dos funciones son casi idénticas. La única diferencia entre ellos es que el cliente puede especificar la calidad del servicio con la función RpcBindingSetAuthInfoEx .

En el fragmento de código siguiente se muestra el aspecto de una llamada a RpcBindingSetAuthInfo .

// This code fragment assumes that rpcBinding is a valid binding 
// handle between the client and the server. It also assumes that
// pAuthCredentials is a valid pointer to a data structure which
// contains the user's authentication credentials.

dwStatus = DsMakeSpn(
    "ldap",
    "ServerName.domain.com",
    NULL,
    0,
    NULL,
    &pcSpnLength,
    pszSpn);

//...

rpcStatus = RpcBindingSetAuthInfo(
    rpcBinding,                       // Valid binding handle
    pszSpn,                           // Principal name 
    RPC_C_AUTHN_LEVEL_PKT_INTEGRITY,  // Authentication level
    RPC_C_AUTHN_GSS_NEGOTIATE,        // Use Negotiate SSP
    NULL,                             // Authentication credentials <entity type="ndash"/> use current thread credentials
    RPC_C_AUTHZ_NAME);                // Authorization service

Después de que el cliente llame correctamente a las funciones RpcBindingSetAuthInfo o RpcBindingSetAuthInfoEx , la biblioteca en tiempo de ejecución rpc autentica automáticamente todas las llamadas RPC en el enlace. El nivel de seguridad y autenticación que selecciona el cliente solo se aplica a ese identificador de enlace. Los identificadores de contexto derivados del identificador de enlace usarán la misma información de seguridad, pero las modificaciones posteriores en el identificador de enlace no se reflejarán en los identificadores de contexto. Para obtener más información, vea Identificadores de contexto.

El nivel de autenticación permanece vigente hasta que el cliente elige otro nivel o hasta que finaliza el proceso. La mayoría de las aplicaciones no requerirán un cambio en el nivel de seguridad. El cliente puede consultar cualquier identificador de enlace para obtener su información de autorización invocando RpcBindingInqAuthClient y pasándole el identificador de enlace.

Proporcionar credenciales de cliente al servidor

Los servidores usan la información de enlace del cliente para aplicar la seguridad. Los clientes siempre pasan un identificador de enlace como primer parámetro de una llamada a procedimiento remoto. Sin embargo, los servidores no pueden usar el identificador a menos que se declare como el primer parámetro para los procedimientos remotos en el archivo IDL o en el archivo de configuración de la aplicación del servidor (ACF). Puede elegir enumerar el identificador de enlace en el archivo IDL, pero esto obliga a todos los clientes a declarar y manipular el identificador de enlace en lugar de usar el enlace automático o implícito. Para obtener más información, vea Los archivos IDL y ACF.

Otro método consiste en dejar los identificadores de enlace fuera del archivo IDL y colocar el atributo explicit_handle en el ACF del servidor. De este modo, el cliente puede usar el tipo de enlace más adecuado para la aplicación, mientras que el servidor usa el identificador de enlace como si se declarara explícitamente.

El proceso de extracción de las credenciales de cliente del identificador de enlace se produce de la siguiente manera:

  • Los clientes RPC llaman a RpcBindingSetAuthInfo e incluyen su información de autenticación como parte de la información de enlace que se pasa al servidor.
  • Normalmente, el servidor llama a RpcImpersonateClient para comportarse como si fuera el cliente. Si el identificador de enlace no está autenticado, se produce un error en la llamada con RPC_S_NO_CONTEXT_AVAILABLE. Para obtener el nombre de usuario del cliente, llame a RpcBindingInqAuthClient durante la suplantación, o en Windows XP o versiones posteriores de Windows, llame a RpcGetAuthorizationContextForClient para obtener el contexto de autorización y, a continuación, use funciones de Authz para recuperar el nombre.
  • Normalmente, el servidor llamará a CreatePrivateObjectSecurity para crear objetos con ACL. Una vez hecho esto, las comprobaciones de seguridad posteriores se convierten en automáticas.