我正在设计一个可能有大约 1000 个用户的 Web 应用程序。网站面向互联网,但仅限合作伙伴使用(即普通大众不能直接“注册一个账号”)。帐户维护将由我们自己的 IT 支持处理。
我正在考虑让每个用户关联自己的 SQL 登录名。这样我就不需要存储他们的加盐/散列密码 - SQL 服务器将处理身份验证。这也允许我们使用基于 SQL Server 的审计和日志记录工具。
这样做有什么坏处吗?
我正在设计一个可能有大约 1000 个用户的 Web 应用程序。网站面向互联网,但仅限合作伙伴使用(即普通大众不能直接“注册一个账号”)。帐户维护将由我们自己的 IT 支持处理。
我正在考虑让每个用户关联自己的 SQL 登录名。这样我就不需要存储他们的加盐/散列密码 - SQL 服务器将处理身份验证。这也允许我们使用基于 SQL Server 的审计和日志记录工具。
这样做有什么坏处吗?
是的,很多 :)
由于密码以明文形式传递,因此您必须设置从应用程序服务器到数据库服务器的加密。
来自 Internet 的所有登录请求都会导致对数据库服务器进行昂贵的身份验证请求。
您无法使用连接池,这将导致每个访问数据库的用户只有一个连接。
如果每个 Web 用户都是 SQL 用户,并且需要使用自己的帐户通过 SQL Server 进行身份验证,那么您将必须存储 SQL 密码而不是 Web 用户密码,并且您必须以未加密的方式存储它,因为您需要先解密它您可以对 SQL 进行身份验证。
正常操作,使用 Windows 身份验证或单个 SQL 服务器帐户向 SQL 服务器验证网站,并在您的 Web 应用程序中管理您的 Web 用户。
我看到的最大缺陷是,如果您的任何用户找到了直接访问您的数据库的方法(我知道它可能被锁定,但事故和黑客攻击时有发生),他们将能够将其丢弃。您的应用程序将确保他们不会以不可接受的方式修改数据,但如果他们直接登录,则不会有此类保护措施。
@spörri 关于连接池的观点非常有道理——这种设置的性能可能很差。
我支持@aaron-bertrand 和@tom-v - SQL 登录不适用于此用例,尝试让它以这种方式工作可能是真正的管理难题。
在同一硬件上安装单独实例的唯一强有力的理由是,如果您有非常非常严格的安全隔离要求。否则总是最好只有一个实例。单个实例可以更好地针对您所面临的负载优化所有硬件资源。多个实例不会相互通信,它们会重叠内存、I/O 和 CPU 负载,从而导致性能下降。
此外,单个实例比单独的实例更易于管理、监控和故障排除。