Per circa 10 anni ho lavorato su varie applicazioni client desktop interne con archivi dati di SQL Server. Raramente ho iniziato questi progetti - la maggior parte sono lavori di acquisizione.
Una cosa che sembrava costante dappertutto era che esisteva 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 utilizzava l' saaccount utente, che in genere cercavo di correggere quando possibile .
Non è possibile nascondere in modo efficace questo nome utente e password utilizzati dall'applicazione per accedere al database. Sono di solito conservati in un inio configdi file, o, eventualmente, cotto in dell'eseguibile stesso. In tutti i casi, sono visibili all'utente se eseguono un po 'di scavo. In un caso abbiamo effettivamente utilizzato un configfile ma crittografato, ma ovviamente la chiave di crittografia doveva essere memorizzata nell'eseguibile (non eravamo ingenui nei limiti di questo, ma impediva effettivamente alle persone di frugare in chi era abbastanza esperto per cercare nei configfile).
Tutti questi sistemi avevano un sistema di autenticazione utente integrato nell'applicazione, ma ovviamente erano tutti gestiti attraverso l'applicazione stessa, il che significa che le informazioni dell'utente erano archiviate nel database. L'applicazione limitava ciò che potevi fare in base al tuo livello di accesso, ma è tutto un po 'discutibile se riesci a connetterti al database ed eseguire query ad hoc.
Sono interessato a sapere cosa fanno gli altri sistemi per aggirare questo problema. Ecco le opzioni che conosco:
- Utilizzare 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 rimuova gli utenti tramite query T-SQL.
- Invece di collegarti direttamente al database, crea un qualche tipo di servizio web che gira sul server e inserisci 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, quindi gli utenti non sono più entità di prima classe e non puoi fare riferimento a loro con relazioni di chiave esterna, ecc.
Il secondo sembra solo un grave problema di prestazioni e un sacco di lavoro extra, inoltre non è possibile utilizzare facilmente i mapper ORM come NHibernate (penso).
Qualcuno ha esperienza con questo? Migliori pratiche?
modificare
Pensando un po 'di più, l'autenticazione di SQL Server può effettivamente 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 in alcun modo che SQL Server possa impedire l'accesso ad altre righe nella tabella dei dettagli della scheda attività, il che significa che è possibile leggere e scrivere anche le schede attività di altre persone.