【发布时间】:2010-06-18 20:13:47
【问题描述】:
我正在尝试在 Global.asax 文件的 Application_BeginRequest 中获取对用户对象的引用。我正在使用属性Context.User,但我得到了NullReferenceException。 是否可以在 Application_BeginRequest 中获取用户对象引用?
【问题讨论】:
标签: asp.net global-asax
我正在尝试在 Global.asax 文件的 Application_BeginRequest 中获取对用户对象的引用。我正在使用属性Context.User,但我得到了NullReferenceException。 是否可以在 Application_BeginRequest 中获取用户对象引用?
【问题讨论】:
标签: asp.net global-asax
您无权访问 User 对象,因为请求尚未经过身份验证。
尝试改用 Application_AuthenticateRequest。
以下是对所有 Global.asax 事件的解释: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5771721.html
以及应用程序生命周期的 MSDN 演练: http://msdn.microsoft.com/en-us/library/ms178473.aspx
编辑: 我明白你在做什么。将您的 if 语句更改为 if not 语句(如果语法错误,抱歉,我不使用 VB.NET):
Sub Application_AuthenticateRequest()
If Context.User <> Nothing Then
Throw New Exception("User now exists")
End Sub
你会注意到这个方法不止一次被命中。直到第二次或第三次才会抛出异常。这是因为每个请求都遵循应用程序生命周期。因此,与其在用户为空时执行任何操作,不如在用户不为空时执行它。
如果您的目标是动态限制访问,您应该创建一个单独的 HttpModule 并将其分配给您要限制的文件
但是,您需要注意不要重写整个 ASP.NET 应用程序安全基础结构。相反,您可以根据角色限制对某些文件夹的访问。
【讨论】:
Global.asax 生命周期有关。我需要User.IsInRole() 功能,它仅在之后 Application_AuthenticateRequest 即在过程Application_AuthorizeRequest() 中可用
不,您必须改用Application_AuthenticateRequest。这是您拥有用户的最早点。
【讨论】: