【发布时间】:2014-02-23 05:42:28
【问题描述】:
我的任务是为我们拥有的旧数据库编写 Web 界面,其中所有用户都有数据库帐户并被分配相应的角色(我们在各处都有触发器记录用户执行某些操作时,所有这些都基于user_name())。
为了使用任何远程现代的东西并避免以纯文本形式存储用户的密码,我正在连接一个对每个用户都具有模拟权限的应用级帐户,并且我正在尝试运行 Execute As User=@username 和Revert 在运行任何 SQL 之前和之后设置和重置执行上下文。
不幸的是,连接池的 reset_connection 调用正在与我的连接一起使用,它最终引发了一些关于物理连接无效的令人讨厌的错误......
我可以通过不使用连接池来解决这个错误。但随后我的应用程序用户需要大量特权才能实际执行模拟。此外,杀死连接池是一件很糟糕的事情......
如何在不牺牲安全性或性能的情况下做到这一点?请记住,我无法改变我的用户拥有数据库登录的事实,而且我对以可检索的方式存储用户密码并不感到兴奋。我唯一的选择是绕过连接池以便我可以模拟(并使用 sa 用户,因此我有足够的权限来实际模拟某人)?
【问题讨论】:
-
请注意,物理连接错误与以下错误一致:连接已被删除,因为打开它的主体随后假定了一个新的安全上下文,然后尝试在其模拟的安全上下文下重置连接。不支持此方案。请参阅联机丛书中的“模拟概述”。
-
Web 应用程序用户是否会通过 Windows 身份验证连接,域 kerberos 是否支持?
-
如何[ab]使用连接参数的另一部分,例如应用程序名称或工作站 ID (connectionstrings.com/all-sql-server-connection-string-keywords) 与
App_Name()或Host_Name()函数结合使用?不理想,但考虑到限制可能是一个可接受的解决方法...... -
@Filip no,用户名和密码
-
@gvee,我知道如何破坏连接池,这不是问题。