2012-04-17 13 views
5

Usando Delphi XE para construir una aplicación de base de datos relativamente sencilla utilizando Datasnap.¿La forma más eficiente de pasar las credenciales de inicio de sesión SQL a los servidores Delphi Datasnap?

Dado que parte de la seguridad de mi aplicación se maneja a nivel de base de datos, necesito pasar las credenciales de SQL de un usuario de mi aplicación cliente a mi servidor Datasnap.

(estoy tratando de hacer que el servidor DataSnap sin estado, si es posible, por lo que reconocer que voy a tener que hacer esto para cada llamada.)

estoy usando ClientDatasets (CDS) en el lado del cliente por lo que podría usar OnBeforeGetRecords para pasar los datos en OwnerData OleVariant desde el CDS en el cliente al correspondiente TDataSetProvider en el servidor. Pero eso significa que cada CDS en cada módulo de datos tiene que tener un evento que hace esto, que parece desordenado y difícil de manejar. No puedo evitar sentir que debe haber una forma de pasar mensajes al servidor en un nivel más alto que eso.

Lo que realmente me gustaría es algo como esto en el nivel DSServerClass en el lado del servidor:

Procedure TMyServerContainer.MyServerClassCreateInstance(DSCreateInstanceEventObject: TDSCreateInstanceEventObject); 
begin 
// Server detects request for data from client app 
fUsername := GetUsernameFromClientSomehow; 
fPassword := GetPasswordFromClientSomehow; 

// create data modules and initialise 
MyDataModule := TMyDataModule.Create(nil); 
MyDataModule.InitialiseWithSQLCredentials(fUsername, fPassword); 
DSCreateInstanceEventObject.ServerClassInstance := MyDataModule; 
End; 

Podría el componente Administrador de autenticación ayudarme aquí? ¿Alguna otra idea? ¿O estoy atrapado con OnBeforeGetRecords?

Muchas gracias.

Respuesta

3

Puede usar las credenciales SQL como nombre de usuario y contraseña para conectarse al servidor DataSnap. Estos valores pueden verificarse en el Administrador de autenticación y/o simplemente reenviarse al componente SQLConnection subyacente para conectarse al servidor SQL.

+0

Gracias, eso parece funcionar - obvio ahora lo señalas pero eso probablemente me ha salvado días. – RichardS

3

La manera más segura sería pasar el token de seguridad del usuario (encriptado) y luego usar la seguridad integrada en el lado del servidor suplantando el contexto de seguridad del usuario que llama. De esta forma, nunca se enviaría usuario/contraseña a través del cable. Desafortunadamente, mientras MS/DCE RPC puede hacer esto para cada llamada (y DCOM, construido sobre RPC), Datasnap no puede (SPNEGO/GSSAPI/SSPI parece complejo para los chicos de Embarcadero, les gustan los protocolos simples e inseguros). De lo contrario, tenga mucho cuidado con la forma en que envía las credenciales a través de la red; podrían olfatearlas fácilmente, a menos que estén protegidas correctamente.

Le aconsejaría de todos modos que los envíe solo una vez, si lo necesita (y de la manera más protegida que pueda), y luego almacénelos protegidos en el servidor (demandando instalaciones de almacenamiento protegidas de Windows) y envíe de vuelta para el cliente un token de control/sesión (vinculado a la IP de origen), para ser utilizado en llamadas posteriores en lugar de volver a enviar credenciales cada vez. Las informaciones se borran cuando el usuario cierra la sesión o los tiempos de espera de la sesión.

Cuestiones relacionadas