Durante unos 10 años, he trabajado en varias aplicaciones internas de clientes de escritorio con almacenes de datos de SQL Server. Raramente comencé estos proyectos, la mayoría son trabajos de adquisición.
Una cosa que parecía constante en todas partes era que había una sola cuenta de usuario global de SQL Server que esta aplicación usaba que le otorgaba permiso para la base de datos común, y sí, en algunas situaciones ingenuas usaba la sa
cuenta de usuario, que generalmente intentaba arreglar cuando era posible .
Realmente no puede ocultar este nombre de usuario y contraseña que la aplicación utiliza para acceder a la base de datos. Por lo general se almacenan en una ini
o config
archivo, o posiblemente al horno en el ejecutable en sí. En todos los casos, son visibles para el usuario si cavan un poco. En un caso, en realidad utilizamos un config
archivo pero lo ciframos, pero, por supuesto, la clave de cifrado tenía que almacenarse en el archivo ejecutable (no éramos ingenuos ante las limitaciones de esto, pero efectivamente evitó que las personas hurgaran lo suficiente como para saberlo). para buscar en los config
archivos).
Todos estos sistemas tenían un sistema de autenticación de usuario integrado en la aplicación, pero, por supuesto, todos se gestionaron a través de la propia aplicación, lo que significa que la información del usuario se almacenó en la base de datos. La aplicación restringió las cosas que podría hacer en función de su nivel de acceso, pero es muy discutible si solo puede conectarse a la base de datos y ejecutar consultas ad-hoc.
Me interesa saber qué hacen otros sistemas para solucionar este problema. Estas son las opciones que conozco:
- Use el mecanismo de seguridad de SQL Server para mantener una lista de usuarios y roles, y hacer que la aplicación de escritorio agregue y elimine usuarios a través de consultas T-SQL.
- En lugar de conectarse directamente a la base de datos, cree algún tipo de servicio web que se ejecute en el servidor y coloque la lógica de autenticación allí. Haga que cada solicitud haga validación de seguridad.
Las primeras opciones son un poco feas porque separas a los usuarios de la base de datos, por lo que los usuarios ya no son entidades de primera clase y no puedes hacer referencia a ellos con relaciones de clave externa, etc.
El segundo parece ser un gran problema de rendimiento y mucho trabajo adicional, además de que no puedes usar fácilmente los mapeadores de ORM como NHibernate (creo).
¿Alguien tiene experiencia con esto? ¿Mejores prácticas?
Editar
Pensando un poco más, ¿puede la autenticación de SQL Server realmente resolver este problema? Por ejemplo, si su usuario debe poder insertar y actualizar los registros de la hoja de tiempo para que pueda editar su hoja de tiempo, no hay forma de que el servidor SQL pueda prohibir el acceso a otras filas en la tabla de detalles de la hoja de tiempo, lo que significa que también puede leer y escribir las hojas de tiempo de otras personas.