Escritura de un servidor SSPI autenticado
Antes de que la comunicación autenticada pueda realizarse entre los programas cliente y servidor, el servidor debe registrar su información de autenticación. En concreto, el servidor debe registrar su nombre principal y especificar el servicio de autenticación que usa. Para obtener más información sobre los nombres principales, vea Nombres principales. Para más información sobre los servicios de autenticación, consulte Servicios de autenticación.
Para registrar su información de autenticación, los servidores llaman a la función RpcServerRegisterAuthInfo . Pase un puntero al nombre principal como el valor del primer parámetro. Establezca el segundo parámetro en una constante que indica el servicio de autenticación que usará la aplicación. Para obtener una descripción de los servicios de autenticación, consulte Authentication-Service Constants (Constantes de servicio de autenticación).
El servidor también puede pasar la dirección de una función de adquisición de claves como valor del tercer parámetro. Consulte Funciones de adquisición de claves. Para usar la función de adquisición de claves predeterminada para el servicio de autenticación seleccionado, establezca el tercer parámetro en NULL. El último parámetro de la función RpcServerRegisterAuthInfo es un dato de puntero para pasar a la función de adquisición de claves, si proporciona una función de adquisición de claves. En el siguiente fragmento de código se muestra una llamada a RpcServerRegisterAuthInfo .
dwStatus = DsMakeSpn(
"ldap",
"ServerName.domain.com",
NULL,
0,
NULL,
&pcSpnLength,
pszSpn);
rpcStatus = RpcServerRegisterAuthInfo (
psz, // Server principal name
RPC_C_AUTHN_GSS_NEGOTIATE, // Authentication service
NULL, // Use default key function
NULL); // No arg for key function
Además, el servidor puede proporcionar a la biblioteca en tiempo de ejecución RPC una función de autorización. Para establecer una función de autorización, llame a la función RpcMgmtSetAuthorizationFn .
La parte del servidor de una aplicación distribuida puede llamar a la función RpcBindingInqAuthClient o RpcBindingInqAuthClientEx para consultar un identificador de enlace para obtener información de autenticación.
Si el servidor se registra con un proveedor de soporte técnico de seguridad, no se enviarán las llamadas de cliente con credenciales no válidas. Sin embargo, las llamadas sin credenciales se enviarán. Hay tres maneras de evitar que esto suceda:
- Registre la interfaz mediante RpcServerRegisterIfEx, con una función de devolución de llamada de seguridad; esto hará que la biblioteca en tiempo de ejecución rpc rechace automáticamente las llamadas no autenticadas a esa interfaz. El registro de una función de devolución de llamada es compatible con otros métodos de comprobación de credenciales de acceso; La función de devolución de llamada puede llamar a las funciones RpcImpersonateClient, RpcGetAuthorizationContextForClient o RpcBindingInqAuthClientEx u otras. Sin embargo, estas funciones no pueden usar los argumentos pasados a la función, ya que no están separados en ese momento.
Importante
El registro de la interfaz mediante RpcServerRegisterIfEx con una función de devolución de llamada de seguridad es el método más recomendado para comprobar las credenciales de cliente.
- Llame a RpcBindingInqAuthClient para determinar el nivel de seguridad que usa el cliente. A continuación, el código auxiliar puede devolver un error si el cliente no está autenticado.