2012-04-17 12 views
5

Utilizzo di Delphi XE per creare un'app per database relativamente semplice con Datasnap.Il modo più efficiente per passare le credenziali di accesso SQL ai server Datasnap Delphi?

Poiché una certa sicurezza nella mia applicazione è gestita a livello di database, ho bisogno di passare le credenziali SQL di un utente dalla mia app client al mio server Datasnap.

(sto cercando di rendere il server DataSnap senza stato, se possibile, in modo da riconoscere che dovrò fare questo per ogni chiamata.)

sto usando ClientDatasets (CDS) sul lato client in modo da potrebbe utilizzare OnBeforeGetRecords per passare i dati nel proprietarioData OleVariant dal CDS sul client al TDataSetProvider corrispondente sul server. Ma questo significa che ogni singolo CDS su ogni modulo dati deve avere un evento che faccia questo, che sembra disordinato e ingombrante. Non posso fare a meno di sentire che ci deve essere un modo per trasmettere messaggi al server a un livello più alto di quello.

Quello che mi piacerebbe davvero è qualcosa di simile a livello DSServerClass sul lato server:

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; 

Può la componente Authentication Manager aiutarmi qui? Altre idee? O sono bloccato con OnBeforeGetRecords?

Molte grazie.

risposta

3

È possibile utilizzare le credenziali SQL come UserName e Password per la connessione al server DataSnap. Questi valori possono essere verificati in Authentication Manager e/o semplicemente inoltrati al componente SQLConnection sottostante per la connessione al server SQL.

+0

Grazie, sembra funzionare - ovvio ora lo fai notare ma probabilmente mi ha risparmiato giorni. – RichardS

3

Il modo più sicuro sarebbe quello di passare il token di sicurezza utente (crittografato) e quindi utilizzare la sicurezza integrata sul lato server impersonando in un thread il contesto di sicurezza dell'utente chiamante. In questo modo nessun utente/password verrebbe mai inviato attraverso il filo. Sfortunatamente mentre MS/DCE RPC può fare questo per ogni chiamata (e DCOM, essendo costruita sopra RPC), Datasnap non può (SPNEGO/GSSAPI/SSPI sembra complesso per i ragazzi di Embarcadero, amano i protocolli semplici e non sicuri). Altrimenti fai molta attenzione nel modo in cui invii credenziali attraverso la rete, potrebbero essere facilmente annusate a meno che non sia protetto correttamente.

Ti consiglierei comunque di inviarli una sola volta, se necessario (e nel modo più protetto possibile), e poi li memorizziamo sul lato server (facendo causa agli archivi di Windows protetti), e rispedisci al client un token di handle/sessione (legato all'IP di origine), da utilizzare nelle chiamate successive anziché reinviare le credenziali ogni volta. Le informazioni vengono cancellate quando l'utente si disconnette oi timeout della sessione.