簡體   English   中英

使用.NET SqlCommand使用EXECUTE AS語句運行T-SQL存儲過程

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

我有一個.NET Web服務應用程序,該應用程序使用System.Data.SqlCommand執行參數化的MS SQL Server存儲過程。 該應用程序從用戶輸入中接收存儲過程的名稱及其參數。

該應用程序還部署在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請求。

前一段時間和我的一位同事解決了。

若要實現請求的行為, execute as語句應在同一SqlConnection中的單獨的先前SqlCommand中運行。

關閉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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM