2017-06-30 75 views
0

我有一個使用System.Data.SqlCommand執行參數化MS SQL Server存儲過程的.NET Web服務應用程序。應用程序從用戶輸入中接收存儲過程的名稱及其參數。使用.NET SqlCommand運行帶有EXECUTE AS語句的t-sql存儲過程

此外,應用程序部署在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請求。

+2

爲什麼當你創建SQL連接對象不指定連接字符串中的用戶名的人,你會執行它爲用戶這樣 –

+0

使用''Windows Authentication'「連接到SQL Server而不是''sa''用戶。 –

+0

我無法在連接字符串中指定用戶憑證,因爲我沒有它們。我只有'域\用戶'格式的用戶名。沒有密碼。 – prot

回答

1

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

要實現請求的行爲,execute as語句應該在同一個SqlConnection中的單獨的SqlCommand之前運行。

關閉reader後,仍然在同一個SqlConnection中,還有另外一個單獨的SqlCommand需要 - revert - 切換回上下文。

1

我有一個類似的問題,我可以作爲用戶執行但恢復不起作用。通過遵循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(); 
相關問題