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

时间:2019-08-20 19:54:15

标签: c# sql-server

我正在尝试通过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;
}

1 个答案:

答案 0 :(得分:3)

首先,应用程序角色很少是正确的安全性方法。它们旨在与以低特权用户身份与Windows集成身份验证连接的最终用户结合使用。这使应用程序代码可以使用半秘密密码将会话从最终用户的身份提升到应用程序角色。这实际上是一个桌面,客户端/服务器应用程序解决方案。因此,它在连接池中从未真正发挥出色。

当连接池尝试重置已设置了应用程序角色的连接时,将引发错误。因此,要使应用程序角色与SqlConnection一起使用,您必须禁用连接池(默认情况下,所有应用程序均处于启用状态,但可以在连接字符串中禁用),或者禁用sp_unsetapprole,然后再将连接返回至池中。

有关其他方法,请参见Application Role Alternatives