使用 HttpHandler 继续处理页面以保护子文件夹

Mic*_*tes 2 c# asp.net httphandler

我创建了一个 HttpHandler 来检查特定目录中的用户授权。它正在运行并经过测试,但是,在运行 ProcessRequest 方法后,它似乎不会继续处理页面。这是它的基础知识:

public AdminProtectionHandler() { }

bool IHttpHandler.IsReusable { get { return true; } }    

void IHttpHandler.ProcessRequest(HttpContext context) {
    if (!Sessions.CurrentUser.Authenticated)
    {
        context.Response.Write("ACCESS DENIED");
        context.Response.End();
    }
}
Run Code Online (Sandbox Code Playgroud)

在子文件夹的 web.Config 中:

<httpHandlers>
    <add verb="*" path="*" validate="true" type="AdminProtectionHandler" />        
</httpHandlers>
Run Code Online (Sandbox Code Playgroud)

未通过身份验证时,我会按预期得到响应:ACCESS DENIED

通过身份验证后,我得到一个空白页,就好像请求刚刚停止一样。

ris*_*ism 5

你混淆HttpHandlerHttpModule.

AnHttpHandler正是这样做的:处理请求。由于您只处理未经授权的情况,因此您只能在未经授权的情况下获取内容。

AnHttpModule将检查请求并对其执行或不执行某些操作,可能让它传递给处理程序,如果它不喜欢它所看到的内容,则可能使请求短路。

重点是HttpModules每个请求多次运行,但每个请求只能运行一次HttpHandler

通过身份验证后,我得到一个空白页,就好像请求刚刚停止一样

因为就您的处理程序而言,它具有。

HttpApplication处理程序返回后,管道会继续运行并触发其他事件,但不会生成其他内容。

您通常不会在处理程序中执行身份验证检查。你会在那之前完成它,并且框架已经为各种身份验证模式内置了它。

但是为了帮助您走上目前的道路,您可以做以下更类似的事情:

public class MyModule : IHttpModule {

     public void Init(HttpApplication app) {
        app.PostResolveRequestCache += (src, args) => {
           if (!Sessions.CurrentUser.Authenticated) {
                app.Context.RemapHandler(new MyHandler());
           }
        }
     }

     public void Dispose() { }
}

public class MyHandler : IHttpHandler
{
    public bool IsReusable { get { return true; } }
    public void ProcessRequest(HttpContext ctx)
    {
        ctx.Response.ContentType = "text/plain";
        ctx.Response.Write("ACCESS DENIED");
        context.Response.End();
    }
}

<modules>
  <remove name="FormsAuthentication" />
  <add name="MyModule" type="MyNamespace.MyModule" />
</modules>
/// Remove your httpHandler web config section.
Run Code Online (Sandbox Code Playgroud)

这样,您的处理程序仅在请求未通过身份验证时才重新映射。否则处理照常继续。