连接到数据库时,ASP.NET丢失用户上下文

时间:2015-10-21 13:57:06

标签: c# asp.net sql-server authentication ado.net

在ASP.NET中,我们有一个应用程序,它使用基本身份验证和ASP.NET模拟提示用户输入其AD凭据。

然后,应用程序使用以下连接字符串

连接到SQL Server
SqlClient.SqlConnection cnn = new SqlClient.SqlConnection();
cnn.ConnectionString = 
  "Server=" + MenuServer + ";" + 
  "Database= " + MenuDatabase + ";" + 
  "Trusted_Connection=Yes;" + 
  "Pooling = False;";
cnn.Open();

99%的情况下,这很好地传递了用户上下文,但偶尔会从SQL Server中收到以下错误:

  

用户' WebServerName $'登录失败。原因:找不到与提供的名称相匹配的登录信息

意味着它无法传递用户凭据,而是默认为IIS工作进程。有趣的是,当我们发现错误时,仍然会使用以下代码准确记录当前用户:

string userName = Environment.UserName;

问题

  • Integrated Security将哪些用户上下文传递给数据库?
  • 是否可以在致电cnn.Open()之前以编程方式检查用户,以确认我们有真实的用户?

1 个答案:

答案 0 :(得分:0)

如果您使用的是ORM Mappers,可能会发生这种情况。实体框架或NHibernate(我用NHibernate体验过这个)。这是因为映射框架使用了Lazy Evaluation:在您提出要求之前,它不会从数据库中获取所有数据。例如,如果您获得的对象列表中的每一个都包含另一个对象列表(例如,Customer包含一个Invoice列表),则在您实际使用它们之前,它将不会获取Invoice对象。

如果你不使用then然后将它们绑定到aspx控件并在aspx页面中执行(而不是在例如PageLoad事件中),那么aspx页面的生命周期意味着它会查看sub代码运行后的-list以及您正在进行的任何模拟已经结束 - 这在IIS帐户下。

您可以通过阻止延迟评估(通常不是一个好主意)或确保在模拟帐户下触摸您需要在代码中使用该页面的每个列表来阻止这种情况发生。< / p>

for each (Customer c in customers)
{
    int i = c.Invoices.Count; // make sure that they do get retrieved.
}