大约十年来,我一直在使用SQL Server数据存储来处理各种内部桌面客户端应用程序。我很少启动这些项目-大多数是接管工作。
似乎到处都是的一件事是,该应用程序使用了一个单一的全局SQL Server用户帐户,该帐户向普通数据库授予了该帐户的权限,是的,在某些幼稚的情况下,它使用了该sa
用户帐户,我通常尝试在可能的情况下进行修复。
您不能真正有效地隐藏应用程序用来访问数据库的用户名和密码。它们通常存储在ini
或config
文件中,或者可能烘焙到可执行文件本身中。在所有情况下,如果进行一点挖掘,它们对于用户都是可见的。在一种情况下,我们实际上使用了一个config
文件但对其进行了加密,但是当然加密密钥必须存储在可执行文件中(我们并非天真地限制了它的局限性,但是它确实有效地阻止了人们回避那些精明的人查看config
文件)。
所有这些系统都在应用程序中内置了一个用户身份验证系统,但是当然它们都是通过应用程序本身进行管理的,这意味着用户信息存储在数据库中。该应用程序根据访问级别限制了您可以执行的操作,但是如果您仅可以连接到数据库并运行即席查询,那就太麻烦了。
我很想知道其他系统可以解决这个问题。这是我所知道的选项:
- 使用SQL Server的安全性机制维护用户和角色列表,并使桌面应用程序通过T-SQL查询添加和删除用户。
- 创建直接在服务器上运行的某种Web服务并将身份验证逻辑放在其中,而不是直接连接到数据库。使每个请求都进行安全验证。
第一个选项有些丑陋,因为您要将用户与数据库分开,因此用户不再是一流的实体,并且不能使用外键关系等来引用它们。
第二个似乎是一个主要的性能问题,需要大量额外的工作,而且您不能像NHibernate(我认为)那样容易地使用ORM映射器。
这个事情谁有经验?最佳做法?
编辑
再想想,SQL Server身份验证能否真正解决此问题?例如,如果您的用户必须能够插入和更新时间表记录,以便您可以编辑时间表,则SQL Server无法禁止访问时间表明细表中的其他行,这意味着您也可以读写其他人的时间表。