【问题标题】:.NET Application_BeginRequest - How to get User reference?.NET Application_BeginRequest - 如何获取用户参考?
【发布时间】:2010-06-18 20:13:47
【问题描述】:

我正在尝试在 Global.asax 文件的 Application_BeginRequest 中获取对用户对象的引用。我正在使用属性Context.User,但我得到了NullReferenceException是否可以在 Application_BeginRequest 中获取用户对象引用?

【问题讨论】:

    标签: asp.net global-asax


    【解决方案1】:

    您无权访问 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 应用程序安全基础结构。相反,您可以根据角色限制对某些文件夹的访问。

    【讨论】:

    • 请查看我在 Julien 的另一个答案中的评论...stackoverflow.com/questions/3072768/…
    • ropstah:我现在明白发生了什么。在处理身份验证请求之前,应用程序正在发出多个请求(可能是图像、脚本、样式表等)。那些其他文件请求可能不需要身份验证,这就是引发异常的原因。在我的答案中尝试更新,看看是否可以澄清。另外,您想用需要 User 对象的代码来实现什么?
    • 情况并非如此,但它Global.asax 生命周期有关。我需要User.IsInRole() 功能,它仅在之后 Application_AuthenticateRequest 即在过程Application_AuthorizeRequest() 中可用
    【解决方案2】:

    不,您必须改用Application_AuthenticateRequest。这是您拥有用户的最早点。

    【讨论】:

    • 这会引发异常,仍然没有用户还是什么? Sub Application_AuthenticateRequest() If Context.User is Nothing Then Throw New Exception("No user") End Sub
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2014-09-29
    相关资源
    最近更新 更多