在ASP.NET中,我们有一个应用程序,它使用基本身份验证和ASP.NET模拟提示用户输入AD凭据。
然后,应用程序使用以下连接字符串连接到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;问答:
cnn.Open()之前以编程方式检查用户以确认我们有真正的用户?发布于 2015-10-21 14:42:25
如果您使用ORM,例如实体框架或NHibernate (我已经使用过NHibernate),就会发生这种情况。这是因为映射框架使用的是延迟评估:它不会从数据库中获取所有数据,除非您请求它。例如,如果您得到一个对象列表,其中每个对象都包含另一个对象列表(例如,Customer包含一个发票列表),那么在实际使用它们之前,它不会得到发票对象。
如果您不使用,直到将它们绑定到aspx控件,并且在aspx页(例如,PageLoad事件)中这样做,那么aspx页面的生命周期意味着它在代码运行之后查看子列表,并且您正在做的任何模拟都已经结束--这是在IIS帐户下进行的。
您可以通过防止延迟计算(通常不是一个好主意),或者确保您在模拟帐户下的代码中需要页面使用的每个列表,来防止这种情况发生。
for each (Customer c in customers)
{
int i = c.Invoices.Count; // make sure that they do get retrieved.
}https://stackoverflow.com/questions/33261315
复制相似问题