[英]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.