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

Running a t-sql stored procedure with EXECUTE AS statement with .NET SqlCommand

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

同样部署在WindowsAD域中的应用程序,它能够借助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 请求。

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

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

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

我遇到了类似的问题,我能够以用户身份执行,但无法恢复。通过遵循 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();