首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当连接到数据库时,ASP.NET会丢失用户上下文

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

Stack Overflow用户
提问于 2015-10-21 13:57:06
回答 1查看 209关注 0票数 1

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

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

代码语言:javascript
运行
复制
SqlClient.SqlConnection cnn = new SqlClient.SqlConnection();
cnn.ConnectionString = 
  "Server=" + MenuServer + ";" + 
  "Database= " + MenuDatabase + ";" + 
  "Trusted_Connection=Yes;" + 
  "Pooling = False;";
cnn.Open();

在99%的情况下,这会很好地传递给用户上下文,但是偶尔我们会从SQL Server中得到以下错误:

用户“WebServerName$”登录失败。原因:无法找到与提供的名称匹配的登录名。

这意味着它无法传递用户凭据,而只能默认为IIS辅助进程。有趣的是,当我们捕捉到错误时,仍然可以使用以下代码准确地记录当前用户:

代码语言:javascript
运行
复制
string userName = Environment.UserName;

问答

  • 集成安全性传递给数据库的用户上下文是什么?
  • 是否可以在调用cnn.Open()之前以编程方式检查用户以确认我们有真正的用户?
EN

回答 1

Stack Overflow用户

发布于 2015-10-21 14:42:25

如果您使用ORM,例如实体框架或NHibernate (我已经使用过NHibernate),就会发生这种情况。这是因为映射框架使用的是延迟评估:它不会从数据库中获取所有数据,除非您请求它。例如,如果您得到一个对象列表,其中每个对象都包含另一个对象列表(例如,Customer包含一个发票列表),那么在实际使用它们之前,它不会得到发票对象。

如果您不使用,直到将它们绑定到aspx控件,并且在aspx页(例如,PageLoad事件)中这样做,那么aspx页面的生命周期意味着它在代码运行之后查看子列表,并且您正在做的任何模拟都已经结束--这是在IIS帐户下进行的。

您可以通过防止延迟计算(通常不是一个好主意),或者确保您在模拟帐户下的代码中需要页面使用的每个列表,来防止这种情况发生。

代码语言:javascript
运行
复制
for each (Customer c in customers)
{
    int i = c.Invoices.Count; // make sure that they do get retrieved.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33261315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档