[英]Azure SQL Database and EXECUTE AS USER - C# Connection Pooling
我有一个Azure SQL数据库和一些使用该数据库的C#业务应用程序。 我一直在努力减少攻击面,并更好地了解性能。
在SQL Azure包含的数据库中,我具有:
1)具有名为“ ReaderUser”的登录名的SQL身份验证用户,具有固定的长密码和疯狂密码。
2)使用以下命令在数据库中创建的未登录用户:CREATE USER [] WITH LOGIN
3)带有数据的表,由USER和行级安全保护。 ReaderUser无法访问任何数据,它仅仅是“代理”用户。
4)ReaderUser可以模拟任何其他非管理用户(创建的各种类型的“未登录”)。 数据只能由任何一个读取。
当用户访问我们开发的应用程序时,将使用ReaderUser建立数据库连接。 应用程序使用.Net 4.6.2 ADO.net连接。 连接字符串已加密并固定。 也就是说,对于任何用户来说,它都不会改变,他们都使用相同的连接字符串。
当应用程序用户登录时,已登录的应用程序标识(Active Directory UPN)随后传递给数据库,以使用以下方法设置正确的用户上下文:
EXECUTE AS USER = 'myuser@mydomain.com' WITH NO REVERT;
然后,用户访问该应用程序并仅查看其数据,这受行级安全性的约束。
我的问题是,如何将连接池化? 是按用户还是按ReaderUser登录(连接字符串)来合并它们? 用户可以使用相同的连接字符串同时从多个应用程序连接。 我已经浏览了几篇文章,但是对于这种特定情况我无法获得清晰的解释。 谁能阐明一些想法?
希望将EXECUTE AS
与连接池一起使用的应用程序必须使用特殊的cookie语法 :
当指定
WITH NO REVERT COOKIE = @varbinary_variable
子句时,SQL Server数据库引擎会将cookie值传递给@varbinary_variable
。 如果调用的REVERT WITH COOKIE = @varbinary_variable
语句包含相同的@varbinary_variable值,则该语句设置的执行上下文只能还原到先前的上下文。在使用连接池的环境中,此选项很有用。 连接池是一组数据库连接的维护,供应用程序服务器上的应用程序重用。 因为传递给@varbinary_variable的值只有EXECUTE AS语句的调用方才知道,所以调用方可以保证它们建立的执行上下文不能被其他任何人更改。
因此,在将连接返回到池之前,您的应用负责使用特殊的cookie还原执行上下文。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.