sql-server - SQL Server Execute As 需要单独登录

标签 sql-server sql-server-2008 impersonation execute-as

晚上,

我想要一些关于我们遇到的问题的实际确认。

我们有一个 K2/SourceCode 解决方案,可以成功地将 EXECUTE AS 与 Sql Server 2008 R2 结合使用。

我们无法直接控制此解决方案的实现方式,即我们无法修改提交给 Sql Server 引擎的查询。当然,我们可以使用 Profiler 捕获它们,它们往往遵循以下模式:

DECLARE @cookie VARBINARY(100); 
EXECUTE AS LOGIN = 'DOMAIN\username' WITH COOKIE INTO @cookie; 
SELECT @cookie;
exec [dbo].[SomeStoredProcedure] /* ... various params ...*/
exec sp_executesql N'REVERT WITH COOKIE = @cookie;',N'@cookie varbinary(100)',@cookie=/* some cookie value */

所以发生的事情是 [SomeStoredProcedure] 在用户 [Domain\username] 的安全上下文中执行,服务(应用程序)帐户模拟该用户。我再次强调,我们无法控制这种模式。这就是应用程序的作用。

从表面上看,这种行为是非常理想的,因为我们希望以这样一种方式安排事情,即存储过程可以由当时处于应用程序前端的任何用户有效地执行。

但是,这些查询一直失败,我们的调查最终导致我们从 Sql Server 文档(我强调的)中找到了这一点:

Specifying a User or Login Name The user or login name specified in EXECUTE AS must exist as a principal in sys.database_principals or sys.server_principals, respectively, or the EXECUTE AS statement fails. Additionally, IMPERSONATE permissions must be granted on the principal. Unless the caller is the database owner, or is a member of the sysadmin fixed server role, the principal must exist even when the user is accessing the database or instance of SQL Server through a Windows group membership. For example, assume the following conditions: CompanyDomain\SQLUsers group has access to the Sales database. CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has implicit access to the Sales database. Although CompanyDomain\SqlUser1 has access to the database through membership in the SQLUsers group, the statement EXECUTE AS USER = 'CompanyDomain\SqlUser1' fails because CompanyDomain\SqlUser1 does not exist as a principal in the database. If the user is orphaned (the associated login no longer exists), and the user was not created with WITHOUT LOGIN, EXECUTE AS will fail for the user.

我们有一组大约 30 名最终用户需要能够使用此应用程序,要求应用程序安全帐户必须能够模拟这些用户中的任何一个来执行这些存储过程。此要求是固定且不可协商的。

上述文档似乎排除了通过将所有 30 个用户添加到一个 AD 组、将该组添加为 SQL Server 登录并授予该组足够的权限来满足此要求的可能性。我们的实际测试结果支持这一点 - EXECUTE AS 失败。

让其中一个用户在 Sql Server 上为他们提供自己的、个人的 AD 登录名,该解决方案将成功地为该用户工作。 EXECUTE AS 成功,不需要给个人账户分配必要的权限,因为他们已经通过AD组的方式分配了。

所以,在这一点上,我有理由相信我知道我必须做什么。要求是每个用户都必须将其 AD 帐户添加为 个人 Sql Server Windows 登录名。

但是,在我继续执行这个繁琐的步骤之前,我想公开问这个问题:我在这里遗漏了什么吗?

在企业级应用程序中想象一个类似的场景是很有启发性的——这个模型会有点崩溃,因为需要添加数百个单独的、Windows 身份验证的 Sql Server 登录。抛开自动化此过程的可能性以及最终会产生的管理负担,我只是觉得想象这是唯一的方法有点牵强。

非常感谢您的确认和/或评论。

谢谢

罗伯特

最佳答案

由于没有人做出相反的回应(或者根本没有),我们假设 BOL 是准确的,并且没有其他解决方案。

关于sql-server - SQL Server Execute As 需要单独登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28463989/

相关文章:

sql - 如何复制自引用表的行

java - 在执行 Spring boot JUnit 类之前仅运行一次 sql 脚本

sql-server-2008 - 如何根据特定模式格式化 SQL Server 日期?

c++ - ImpersonateLoggedOnUser 成功但辅助进程仍在初始上下文中运行

sql - 数据库中所有表的列表

sql-server - 数据从 SQL Server 数据库中消失

sql-server - 将水平数据转换为垂直数据

sql - 合并两个 View

.net - 使用 Windows 身份验证时如何模拟另一个 Windows 用户?

java - google oauth2 使用 user@gmail.com 模拟服务帐户