【问题标题】:Azure SQL Database and EXECUTE AS USER - C# Connection PoolingAzure SQL 数据库和以用户身份执行 - C# 连接池
【发布时间】:2016-09-08 15:51:16
【问题描述】:

我有一个 Azure SQL 数据库和一些使用它的 C# 业务线应用程序。我一直在努力减少攻击面并更好地了解性能。

在包含 SQL Azure 的数据库中,我有:
1) 具有名为“ReaderUser”的登录名的 SQL 身份验证用户,具有固定的长而疯狂的密码。
2) 在没有登录的情况下在数据库中创建的用户使用:CREATE USER [] WITHOUT LOGIN
3) 带有数据的表,由 USER 和 Row Level Security 保护。 ReaderUser 无法访问任何数据,它只是一个“代理”用户。
4) ReaderUser 可以冒充任何其他非管理用户(“无需登录”创建的品种)。数据只能由其中任何一个读取。

当我们开发的应用程序被用户访问时,数据库连接是通过 ReaderUser 建立的。应用程序使用 .Net 4.6.2 ADO.net 连接。连接字符串是加密和固定的。 IE。对于任何用户,它都不会改变,他们都使用相同的连接字符串。

当应用程序用户登录时,登录的应用程序身份 (Active Directory UPN) 会被传递到数据库以使用以下方法设置正确的用户上下文:

EXECUTE AS USER = 'myuser@mydomain.com' WITH NO REVERT;

然后用户访问应用程序并仅看到他们的数据,这受到行级安全性的限制。

我的问题是,连接将如何汇集?它们是按用户还是按 ReaderUser 登录名(连接字符串)汇总的?用户可以使用相同的连接字符串同时从多个应用程序进行连接。我浏览了几篇文章,但无法对这种特定情况做出明确的解释。有人能解释一下吗?

【问题讨论】:

    标签: c# sql-server ado.net database-connection azure-sql-database


    【解决方案1】:

    希望将EXECUTE AS 与连接池结合使用的应用程序必须使用special cookie syntax

    当指定 WITH NO REVERT COOKIE = @varbinary_variable 子句时,SQL Server 数据库引擎将 cookie 值传递给 @varbinary_variable。只有在调用REVERT WITH COOKIE = @varbinary_variable 语句包含相同的@varbinary_variable 值时,该语句设置的执行上下文才能恢复到之前的上下文。

    此选项在使用连接池的环境中很有用。连接池是维护一组数据库连接以供应用程序服务器上的应用程序重用。因为传递给 @varbinary_variable 的值只有 EXECUTE AS 语句的调用者知道,所以调用者可以保证他们建立的执行上下文不会被其他任何人更改。

    因此,您的应用负责使用特殊 cookie 恢复执行上下文,然后再将连接返回到池中。

    【讨论】:

    • 所以如果我使用我的场景,使用“EXECUTE AS USER = 'myuser@mydomain.com' WITH NO REVERT;”我会没有连接池,还是会出现连接池和混乱的用户?
    • 不能将池与 EXECUTE AS .. NO REVERT 一起使用,除非您使用这些 cookie。你会得到的是不可预测性。是不是.Net 可以秒猜你的行为。是 you 指定池(通过连接字符串)。如果您指定池化并且您使用 EXECUTE AS,那么结果是不确定的。
    • 您必须了解EXECUTE AS ... 在您打开连接很久之后才发生,因此此时池已经生效。其次,.Net 客户端库(控制池)无法知道您发出了 EXECUTE AS(想想看,它可以在不透明的存储过程调用之后执行,客户端库如何知道它发生了?)。因此,当您完成连接后,它将返回到池中,然后尝试重用。这是事情将以不可预测的方式变得混乱的时候。 在掌控之中,你必须做正确的事。
    • 谢谢 - 我想确认的是不可预测性。很有帮助。因此,要使用 EXECUTE AS WITH NO REVERT 进行预测,必须在连接字符串中指定 Pooling=false。或者,可以执行 AS (WITH REVERT) 并确保在关闭连接之前调用 REVERT(这是不稳定的,因为异常或连接问题可能会阻止 REVERT 总是被调用)。因此,简而言之,对于可靠的 EXECUTE AS,最好不要池化并使用 NO REVERT 的额外保护。同意吗?
    • 同意。请记住,尽管您遇到了连接问题,但连接将不会返回到池中,因为它将被关闭。风险在于,如果您在调用 connection.Close() 的代码中存在错误,而无法正确还原。但我同意这是一个相当大的风险。我将删除池,并且仅将其添加回关键调用路径,如果证明可以显着提高性能,并且仅适用于可以保证使用 cookie 发出正确还原的易于理解的行为(祝您好运!满足所有标准!:))
    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2017-04-29
    • 2014-07-20
    • 2015-11-26
    • 2016-10-20
    • 2018-10-15
    • 2014-06-08
    相关资源
    最近更新 更多