2015-10-01 6 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

Вы путаете HttpHandler с HttpModule.

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. 

Таким образом, ваш обработчик переназначен только если запрос не прошел проверку подлинности. В противном случае обработка продолжается, как обычно.