继续使用 HttpHandler 处理页面以保护子文件夹
Continue processing page with HttpHandler for securing subfolder
我创建了一个 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();
}
}
子文件夹web.Config中:
<httpHandlers>
<add verb="*" path="*" validate="true" type="AdminProtectionHandler" />
</httpHandlers>
未通过身份验证时,我得到了预期的响应:拒绝访问
通过身份验证后,我得到一个空白页面,就好像请求刚刚停止一样。
您混淆了 HttpHandler
和 HttpModule
。
HttpHandler
正是这样做的:处理请求。
由于您只处理未经授权的情况,因此您只能在未经授权时获取内容。
HttpModule
将检查请求并对其执行或不执行某些操作,可能会让它传递给处理程序,如果它不喜欢它所看到的,可能会短路请求。
每个请求有多个 HttpModules
运行,但每个请求只有一个 HttpHandler
。
When authenticated, I get a blank page, as if the request just stopped
因为关于你的处理程序,它有。
HttpApplication
管道继续 运行 在您的处理程序 returns 之后触发其他事件,但不会生成其他内容。
您通常不会在处理程序中执行身份验证检查。你会在那之前做,并且框架已经为各种身份验证模式内置了它。
但为了帮助您走上目前的道路,您需要做更多类似以下的事情:
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.
这样你的处理程序只有在请求未通过身份验证时才会重新映射。否则处理将照常继续。
我创建了一个 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();
}
}
子文件夹web.Config中:
<httpHandlers>
<add verb="*" path="*" validate="true" type="AdminProtectionHandler" />
</httpHandlers>
未通过身份验证时,我得到了预期的响应:拒绝访问
通过身份验证后,我得到一个空白页面,就好像请求刚刚停止一样。
您混淆了 HttpHandler
和 HttpModule
。
HttpHandler
正是这样做的:处理请求。
由于您只处理未经授权的情况,因此您只能在未经授权时获取内容。
HttpModule
将检查请求并对其执行或不执行某些操作,可能会让它传递给处理程序,如果它不喜欢它所看到的,可能会短路请求。
每个请求有多个 HttpModules
运行,但每个请求只有一个 HttpHandler
。
When authenticated, I get a blank page, as if the request just stopped
因为关于你的处理程序,它有。
HttpApplication
管道继续 运行 在您的处理程序 returns 之后触发其他事件,但不会生成其他内容。
您通常不会在处理程序中执行身份验证检查。你会在那之前做,并且框架已经为各种身份验证模式内置了它。
但为了帮助您走上目前的道路,您需要做更多类似以下的事情:
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.
这样你的处理程序只有在请求未通过身份验证时才会重新映射。否则处理将照常继续。