对于一个存储过程调用

时间:2015-10-06 00:58:59

标签: asp.net sql-server webforms sql-server-2012

幸运的是,这是在UAT而不是生产。

UAT服务器是运行SQL Server 2012和Windows Server 2012的Azure VM。 在应用程序的一个页面上,我收到错误

  

用户'用户'登录失败。在System.Data.SqlClient.SqlInternalConnection

     

Microsoft.ApplicationBlocks.Data.SqlHelperParameterCache.GetSpParameterSetInternal(SqlConnection连接,String spName,Boolean includeReturnValueParameter)
  在Microsoft.ApplicationBlocks.Data.SqlHelperParameterCache.GetSpParameterSet(String connectionString,String spName,Boolean includeReturnValueParameter)
  在Microsoft.ApplicationBlocks.Data.SqlHelperParameterCache.GetSpParameterSet(String connectionString,String spName)

登录是SQL Server登录,而不是域登录

在SAME网页上,还有另外3个存储过程调用,这些调用是在此存储过程开始之前使用相同的连接字符串对同一个数据库进行的调用

我已经删除并重新创建了存储过程

我已经删除并重新创建了数据库登录

该帐户是数据库角色的成员,该角色授予它对此存储过程所属的架构的EXECUTE权限

如果我以此用户身份登录SSMS,我可以:

  • 展开数据库的存储过程列表
  • 展开受影响的存储过程的参数列表
  • 运行受影响的存储过程并获得预期结果

我在SQL Server上设置了另一个Web服务器,它使用连接字符串中的域登录,运行没有问题。我们正在尝试弃用该网站的SQL Server版本。

任何人都可以提出可能导致此问题的建议,以及如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

感谢.NET SqlClient安全行为。 通过数据应用程序块进行工作调用

return SqlHelper.ExecuteReader(ConnectionString, sql_OutboundQueue_TypeAndStatusCount, DBUtility.GetNull(since)); 

这链接到调用SqlHelperParameterCache.GetSpParameterSet

通过数据应用程序块进行失败调用

SqlConnection con = new SqlConnection(QueueDataProvider.ConnectionString);
SqlCommand cmd = new SqlCommand(QueueDataProvider.OutboundQueue.sql_OutboundQueue_Search, con);
con.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(SqlHelperParameterCache.GetSpParameterSet(con.ConnectionString, cmd.CommandText));

原因: 如果您使用SQL登录,con.ConnectionString已清除密码,但仅在您调用con.Open后清除

感谢:ConnectionString loses password after connection.Open