8

Tenemos un servidor escrito en Delphi que usa RemObjects DataAbstract/SDK. Nos gustaría utilizar la autenticación de Windows para autenticar a los usuarios para permitirles el acceso a nuestro servidor.Cómo autenticar a un usuario en el nivel medio mediante la autenticación de Windows

Actualmente haga lo siguiente:

1 aplicación de cliente) envía el nombre de usuario y contraseña de Windows en texto sin cifrar al servidor. 2) El servidor comprueba las credenciales usando la siguiente función:

function ValidateUserLogonAPI(const UserName: string; const Domain: string; 
    const PassWord: string) : boolean; 
var 
    Retvar: boolean; 
    LHandle: THandle; 
begin 
    Retvar := LogonUser(PWideChar(UserName), 
           PWideChar(Domain), 
           PWideChar(PassWord), 
           LOGON32_LOGON_NETWORK, 
           LOGON32_PROVIDER_DEFAULT, 
           LHandle); 

    if Retvar then 
    CloseHandle(LHandle); 

    Result := Retvar; 
end; 

Por supuesto, este método tiene la desventaja de que las credenciales de usuario se transmiten sobre la red en texto claro. Podríamos encriptarlos, pero las claves de cifrado/descifrado deberían enviarse dentro de la aplicación.

Estoy seguro de que debe haber una mejor manera de lograr nuestro objetivo. He leído un poco sobre tokens, pero realmente no entiendo cómo funcionarían en esta situación.

Tenga en cuenta que la solución debe funcionar tanto para un cliente Delphi Windows como para un cliente Delphi Prism ASP.NET.

Gracias por cualquier ayuda que pueda dar.

+0

¿Ha considerado utilizar una solución basada en Kerberos? Requiere una instancia de Kerberos ejecutándose en la red, pero es uno de los protocolos de autenticación estándar de facto en una red no segura. http://en.wikipedia.org/wiki/Kerberos_%28protocol%29 – mjn

+0

Si tiene un dominio AD, tiene Kerberos, aunque Windows tiene un mecanismo para permitir que diferentes métodos de autenticación funcionen con la misma interfaz –

+0

¿Es una intranet? (o VPN) o una aplicación basada en Internet? Para Intranet y Kerberos, quizás esto ayude: http://stackoverflow.com/questions/1052369/how-can-i-get-a-kerberos-ticket-with-delphi – mjn

Respuesta

2

Eso es algo que DataAbstract debe manejar solo, y si no es una biblioteca media respaldada como Datasnap :) Cuando se trata de comunicación remota, autenticar/autorizar puntos finales y proteger el intercambio de datos es realmente crítico.

Básicamente, no tiene que enviar las credenciales del usuario, pero intercambia un "token" que el cliente y el servidor saben cómo autenticarse. Una explicación completa puede ser compleja. Puede comenzar desde MSDN (busque AcceptSecurityContext() e InitializeSecurityContext()). Un problema posible es si DataAbastract tiene los ganchos adecuados para implementar la fase de autenticación, lo que puede requerir más de una ida y vuelta.

Como medida provisional, puede habilitar IPSec para proteger el canal de comunicación y no permitir que la cuenta de todo el usuario sea "olfateada" fácilmente.

+0

DataAbstract es una excelente biblioteca, pero sin duda la seguridad está en sus puntos débiles. Es por eso que escribimos nuestro propio código de autenticación para que los ganchos no sean un problema :) Realmente no tenemos tiempo para reinventar la rueda, por lo que sería bueno si pudiera encontrar algunos ejemplos en Delphi. – norgepaul

Cuestiones relacionadas