2015-10-01 32 views
2

我创建了一个HttpHandler来检查特定目录中的用户授权。它正在运行并经过测试,但是,它在运行ProcessRequest方法后似乎不会继续处理页面。这是它的基本功能:使用HttpHandler继续处理页面以保护子文件夹

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(); 
    } 
} 

在子文件夹中的Web.config:

<httpHandlers> 
    <add verb="*" path="*" validate="true" type="AdminProtectionHandler" />   
</httpHandlers> 

如果没有通过认证,我得到响应预期:拒绝,

当认证的访问,我得到一个空白页面,就好像请求刚刚停止一样。

回答

4

您已将HttpHandlerHttpModule混淆。

HttpHandler的确如此:处理请求。 由于您只处理未经授权的情况,因此您只能在未经授权的情况下获得内容。

HttpModule将审查请求,要么根本不还是用它做什么,这可能让它通过将处理程序,可能短路的要求,如果它不喜欢它认为。

该点为多个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. 

这样,如果该请求未通过身份验证的处理器只重映射。否则处理继续按照惯例。