运行 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();
我有一个 .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();