使用 .NET SqlCommand 运行带有 EXECUTE AS 语句的 t-sql 存储过程

Posted

技术标签:

【中文标题】使用 .NET SqlCommand 运行带有 EXECUTE AS 语句的 t-sql 存储过程【英文标题】:Running a t-sql stored procedure with EXECUTE AS statement with .NET SqlCommand 【发布时间】:2017-06-30 06:51:57 【问题描述】:

我有一个使用 System.Data.SqlCommand 执行参数化 MS SQL Server 存储过程的 .NET Web 服务应用程序。应用程序从用户输入中接收存储过程的名称及其参数。

同样是部署在 Windows AD 域中的应用程序,它能够在 SSPI 身份验证的帮助下获取远程用户的名称。

using (var con = new SqlConnection(connectionString)) 
  using (var cmd = new SqlCommand(procedureName, con)) 
    cmd.CommandType = CommandType.StoredProcedure;
    foreach (var pair in pairs.AllKeys) 
        cmd.Parameters.Add(new SqlParameter(pair, pairs[pair]));
    
    con.Open();
    using (var reader = cmd.ExecuteReader()) 
      // processing results
    
  

现在我想用 EXECUTE AS 语句执行一个存储过程。

use [db]
go
execute as user = 'domain\user' --execute as RemoteUser
exec [db].[stored_procdure] @param1=value1

这可以吗?如何将 EXECUTE AS 添加到 SqlCommand?

我不想求助于易于注入 sql 的代码并从用户收到的字符串构建 sql 请求。

【问题讨论】:

在创建sql连接对象的时候为什么不在连接字符串中指定用户名,这样就以那个用户的身份执行了 使用Windows Authentication 连接到SQL Server 而不是sa 用户。 我无法在连接字符串中指定用户凭据,因为我没有它们。我只有一个“域\用户”格式的用户名。没有密码。 如果你使用windows认证那为什么需要以用户身份执行? 那么为什么您需要“执行为”您的命令已经以使用连接的用户身份执行?!? 【参考方案1】:

前段时间和我的一个同事解决了这个问题。

要实现所请求的行为,execute as 语句应在单独的前面的 SqlCommand 中运行,同时在同一个 SqlConnection 中。

reader 关闭后,仍然在同一个 SqlConnection 中,需要另一个单独的 SqlCommand - revert - 来切换回上下文。

【讨论】:

【参考方案2】:

我遇到了类似的问题,我能够以用户身份执行,但恢复不起作用。通过遵循prot的回答,我能够修复它。所以对于任何有类似问题的人来说,这就是代码的样子

   SqlCommand cmd = new SqlCommand("EXECUTE AS USER = 'domain\\user';");
   OSSDBDataContext dc = new OSSDBDataContext();
   cmd.Connection = dc.Connection as SqlConnection;
   cmd.Connection.Open();
   cmd.ExecuteNonQuery();

   //Execute stored procedure code goes here

   SqlCommand cmd2 = new SqlCommand("REVERT;");
   cmd2.Connection = dc.Connection as SqlConnection;
   cmd2.ExecuteNonQuery();

【讨论】:

以上是关于使用 .NET SqlCommand 运行带有 EXECUTE AS 语句的 t-sql 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何使用替换的参数捕获 SQL? (.NET,SqlCommand)

ADO.NET_SqlCommand类

如何编写 SqlCommand 在 ASP.NET 的列中选择前 3 个重复次数最多的值

如何编写一个SqlCommand,在ASP.NET中的列中选择前3个最重复的值

从 .net 中的 Generic T 获取 SqlCommand 类型

.Net SqlCommand.ExecuteNonQuery 中的查询超时,适用于 SQL Server Management Studio