Por cerca de 10 anos, trabalhei em vários aplicativos clientes de desktop internos com repositórios de dados do SQL Server. Raramente iniciei esses projetos - a maioria é trabalho de aquisição.
Uma coisa que parecia constante em todos os lugares foi que havia uma única conta de usuário global do SQL Server que esse aplicativo usava que concedia permissão ao banco de dados comum e sim, em algumas situações ingênuas, usava a sa
conta de usuário, que geralmente tentava corrigir quando possível .
Você não pode ocultar efetivamente esse nome de usuário e senha que o aplicativo usa para acessar o banco de dados. Eles são geralmente armazenados em um ini
ou config
arquivo, ou, eventualmente, cozido no executável em si. Em todos os casos, eles ficam visíveis para o usuário se eles fizerem uma pequena escavação. Em um caso, na verdade, usamos um config
arquivo, mas o criptografamos, mas é claro que a chave de criptografia tinha que ser armazenada no executável (não éramos ingênuos às limitações disso, mas efetivamente impedia as pessoas de bisbilhotar quem era esperto o suficiente procurar nos config
arquivos).
Todos esses sistemas tinham um sistema de autenticação de usuário embutido no aplicativo, mas é claro que todos foram gerenciados pelo próprio aplicativo, o que significa que as informações do usuário foram armazenadas no banco de dados. O aplicativo restringia o que você poderia fazer com base no seu nível de acesso, mas é muito discutível se você puder se conectar ao banco de dados e executar consultas ad-hoc.
Estou interessado em saber o que outros sistemas fazem para solucionar esse problema. Aqui estão as opções que eu conheço:
- Use o mecanismo de segurança do SQL Server para manter uma lista de usuários e funções e fazer com que o aplicativo da área de trabalho adicione e remova usuários por meio de consultas T-SQL.
- Em vez de se conectar diretamente ao banco de dados, crie algum tipo de serviço da web que seja executado no servidor e coloque a lógica de autenticação. Faça todas as solicitações de validação de segurança.
As primeiras opções são um pouco feias porque você está separando os usuários do banco de dados, de modo que os usuários não são mais entidades de primeira classe e não é possível referenciá-los com relacionamentos de chave estrangeira etc.
O segundo parece ser um grande problema de desempenho e muito trabalho extra, além de você não poder usar com facilidade os mapeadores ORM como o NHibernate (eu acho).
Alguém tem experiência com isto? Melhores Práticas?
Editar
Pensando um pouco mais, a autenticação do SQL Server pode realmente resolver esse problema? Por exemplo, se o usuário precisar inserir e atualizar registros do quadro de horários para que você possa editá-lo, não há como o SQL server proibir o acesso a outras linhas na tabela de detalhes do quadro de horários, o que significa que você também pode ler e escrever quadros de horários de outras pessoas.