Per circa 10 anni ho lavorato su varie applicazioni client desktop interne con archivi dati di SQL Server. Raramente ho avviato questi progetti - la maggior parte sono lavori di acquisizione.
Una cosa che sembrava costante ovunque era che c'era un unico account utente globale di SQL Server che questa applicazione usava che gli concedeva l'autorizzazione per il database comune, e sì in alcune situazioni ingenue usava l'account utente sa
, che io in genere ho cercato di correggere quando possibile.
Non è possibile nascondere in modo efficace questo nome utente e password utilizzati dall'applicazione per accedere al database. Solitamente sono memorizzati in un file ini
o config
, o eventualmente inseriti nell'eseguibile stesso. In tutti i casi, sono visibili all'utente se fanno un po 'di scavo. In un caso abbiamo effettivamente utilizzato un file config
ma lo abbiamo crittografato, ma ovviamente la chiave di crittografia doveva essere archiviata nell'eseguibile (non eravamo ingenui con le limitazioni di questo, ma effettivamente ha impedito alle persone di frugare chi sono stati abbastanza esperti da cercare in config
file).
Tutti questi sistemi avevano un sistema di autenticazione utente integrato nell'applicazione, ma naturalmente erano tutti gestiti attraverso l'applicazione stessa, il che significa che le informazioni dell'utente erano memorizzate nel database. L'applicazione ha limitato le cose che potresti fare in base al tuo livello di accesso, ma è tutto di tipo moot se puoi semplicemente collegarti al database ed eseguire query ad-hoc.
Sono interessato a sapere quali altri sistemi fanno per aggirare questo problema. Ecco le opzioni che conosco:
- Utilizza il meccanismo di sicurezza di SQL Server per mantenere un elenco di utenti e ruoli e fare in modo che l'applicazione desktop aggiunga e rimuovi utenti tramite query T-SQL.
- Invece di connettersi direttamente al database, creare una sorta di servizio Web che gira sul server e inserire la logica di autenticazione. Fai in modo che ogni richiesta esegua la convalida della sicurezza.
Le prime opzioni sono un po 'brutte perché stai separando gli utenti dal database in modo che gli utenti non siano più entità di prima classe e non puoi farvi riferimento con le relazioni con le chiavi esterne, ecc.
Il secondo sembra solo un grosso problema di prestazioni e molto lavoro extra, inoltre non è possibile utilizzare facilmente mapper ORM come NHibernate (credo).
Qualcuno ha esperienza con questo? Best practice?
Modifica
Pensando un po 'di più, l'autenticazione di SQL Server può realmente risolvere questo problema? Ad esempio, se l'utente deve essere in grado di inserire e aggiornare i record della scheda attività in modo da poter modificare la scheda attività, non è possibile che SQL Server impedisca l'accesso ad altre righe nella tabella dei dettagli della scheda attività, il che significa che è possibile leggere e scrivere altro timesheets delle persone.