ASP.NET 如何在应用程序请求模块中访问 User.Identity.IsAuthenticated?

Posted

技术标签:

【中文标题】ASP.NET 如何在应用程序请求模块中访问 User.Identity.IsAuthenticated?【英文标题】:ASP.NET how to access User.Identity.IsAuthenticated in Aplication Request module? 【发布时间】:2012-06-27 01:17:37 【问题描述】:

我在 ASP.Net 中使用表单身份验证方法,问题是它只保护“.aspx”文件。我正在尝试保护“kcfinder”文件夹中的“.php”文件免受未经身份验证的用户的攻击。

我在“App_Code”文件夹中实现了这个类。

public class KCChecker

        public static void Process(HttpApplication Application)
    
           HttpRequest Request = Application.Context.Request;
           HttpResponse Response = Application.Context.Response;
           string url = Request.Path.ToLower();
           if (url.IndexOf("/kcfinder/") == 0 && !HttpContext.Current.User.Identity.IsAuthenticated)
            
            Response.Redirect("/");
            
        

问题是它总是说“对象引用未设置为对象的实例”。在HttpContext.Current.User.Identity.IsAuthenticated。我尝试将其更改为Application.Context.User.Identity.IsAuthenticated,但仍然显示相同的错误。

有什么方法可以在这个自定义模块的 Process 函数中访问用户对象?

【问题讨论】:

免责声明 - 我没有在 IIS 下运行 PHP 的经验。但是,IIS 有某些类型配置为由 Asp.Net 处理,我不希望 php 由 Asp.Net 处理,因此 Context 将为空。 上下文不为空。上下文对象的请求和响应都在工作。 ONLY Request.User 为空。 那么 Request.IsAuthenticated 返回什么 - 真/假?可能是您启用了匿名访问吗?我也是found这个:runAllManagedModulesForAllRequests="true" Request.IsAuthenticated 总是返回 false。我刚刚在 ASP.NET 论坛上阅读了该主题。是的!添加“”允许我访问 Application.Context.User.Identity.IsAuthenticated。您可以在下面发布您的答案吗?这样我才能接受?干杯。 哦,不。我不确定它是否允许我访问该对象,但添加该属性后,我的表单authenticaiton 正在保护kcfinder 文件夹。这是我想要的,甚至是最好的解决方案,而不是由 HttpHandler 处理。谢谢。 【参考方案1】:

将以下内容添加到您的 web.config 文件中:

<modules runAllManagedModulesForAllRequests="true" />

【讨论】:

我发现了关于 Google Chrome 的一件有趣的事情。如果请求文件是 .aspx,它看起来很好,它会重定向到登录页面,但是当它是 .pdf 或 .jpg 时,它会像无限循环一样不断尝试,但它仍然可以保护资源。它在所有其他浏览器上都可以正常工作,除了 google chrome。【参考方案2】:

HttpApplication.PostAuthenticateRequest Event

将 PostAuthenticateRequest 的事件处理程序添加到您的 HttpModule 并从那里调用您的 Process(HttpApplication) 方法。

public class AuthModule : IHttpModule

    public void Init(HttpApplication context)
    
        context.PostAuthenticateRequest += new EventHandler(context_PostAuthenticateRequest);
    

    public void Dispose()  

    void context_PostAuthenticateRequest(object sender, EventArgs e)
    
        var isAuthenticated = ((HttpApplication) sender).Context.User.Identity.IsAuthenticated;
    

【讨论】:

它仍然显示“对象引用未设置为对象的实例。”。关于“bool isAuthenticated = ((HttpApplication)sender).Context.User.Identity.IsAuthenticated;” 奇怪,NULL 到底是什么?上下文用户?它应该在 ASP.NET 生命周期的那个时刻定义。 这个问题的最佳答案!

以上是关于ASP.NET 如何在应用程序请求模块中访问 User.Identity.IsAuthenticated?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 应用程序中的 Openoffice 参考

ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限

如何在ASP NET Core中实现CORS跨域

asp.net关于如何准许api跨域访问

如何动态更改连接字符串 ASP.NET

我如何检测请求是不是来自我的 asp.net MVC 3 中的移动浏览器