具有 SQL Server 应用程序角色的 C#:无法继续执行,因为会话处于终止状态



我正在尝试在 C# Winforms Desktop 应用程序中使用我的连接实现应用程序角色。 第一个连接一切正常,我使用 using{} 结构正确关闭它。 但是,当我创建第二个连接时,我收到"无法继续执行,因为会话处于终止状态"错误。 知道为什么我会收到此错误以及如何进行故障排除吗? 这是我的代码,我收到错误以及设置应用程序角色的方法:

try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
oAppRole.setApplicationRole(connection);
string query = "<sql statement here>";
using (var cmd = new SqlCommand(query, connection))
{
cmd.Parameters.AddWithValue("@EmpID", empID);
cmd.Parameters.AddWithValue("@ExpDate", priorExpDate);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dtReturnTable);
}
}
}
catch (Exception ex)
{
throw ex;
}

public bool setApplicationRole(SqlConnection connection)
{
bool retVal = true;
string procName = "sys.sp_setapprole";
SqlCommand cmd = new SqlCommand(procName);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Connection = connection;
// Parameter for Application Role Name
SqlParameter parmAppRoleName = new SqlParameter();
parmAppRoleName.ParameterName = "@rolename";
parmAppRoleName.Value = "myAppRole";
cmd.Parameters.Add(parmAppRoleName);
// Parameter for Application Role Password
SqlParameter parmAppRolePwd = new SqlParameter();
parmAppRolePwd.ParameterName = "@password";
parmAppRolePwd.Value = "myPassword";
cmd.Parameters.Add(parmAppRolePwd);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
retVal = false;
throw(ex);
}
return retVal;
}

首先,应用程序角色很少是正确的安全方法。 它们旨在与作为低特权用户使用 Windows 集成身份验证连接的最终用户结合使用。 这使应用程序代码能够使用半机密密码将会话从最终用户的标识提升为应用程序角色。 这实际上是一个桌面、客户端/服务器应用程序解决方案。 因此,它从来没有真正很好地与连接池配合使用。

当连接池尝试重置已设置应用程序角色的连接时,将引发错误。 因此,若要使应用程序角色使用 SqlConnection,必须禁用连接池(在所有应用程序中默认启用,但可以在连接字符串中禁用(,或者在将连接返回到池之前禁用sp_unsetapprole。

有关替代方法,请参阅应用程序角色替代方法。

相关内容

最新更新