2012-06-27 4 views
2

Я использую метод аутентификации формы в ASP.Net, и проблема в том, что он защищает только файлы «.aspx». Я пытаюсь защитить файлы « .php» в папке «kcfinder» от не прошедших проверку пользователей.ASP.NET как получить доступ к User.Identity.IsAuthenticated в Aplication Request module?

Я выполнил этот класс в папке «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, но он по-прежнему показывает ту же ошибку.

Можно ли каким-либо образом получить доступ к объекту пользователя в функции процесса этого настраиваемого модуля?

+0

Отказ от ответственности - я не имею опыт ведения PHP под IIS. Тем не менее, IIS имеет определенные типы, настроенные для обработки Asp.Net, и я не ожидал, что php будет обработан Asp.Net, поэтому Context будет null. – Michael

+0

Контекст не равен нулю. Запрос и ответ Контекстного объекта все работают. ТОЛЬКО Request.User имеет значение null. –

+0

Итак, что возвращает Request.IsAuthenticated return - true/false? Может быть, у вас включен анонимный доступ? Также я [нашел] (http://forums.asp.net/t/1689878.aspx/1) this: runAllManagedModulesForAllRequests = "true" – Michael

ответ

2

Добавьте следующие строки в файл web.config:

<modules runAllManagedModulesForAllRequests="true" /> 
+0

Я нашел одну забавную вещь о Гугл Хром. Если файл запроса является .aspx, он выглядит нормально и перенаправляется на страницу входа, но когда он равен .pdf или .jpg, он продолжает пытаться использовать бесконечный цикл, но он по-прежнему защищает ресурсы. Он отлично работает во всех других браузерах, кроме Google Chrome. –

1

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; 
    } 
} 
+0

Он по-прежнему показывает, что« Ссылка на объект не установлена ​​в экземпляр объекта. ». На« bool isAuthenticated = ((HttpApplication) отправитель). Контекст. User.Identity.IsAuthenticated; " –

+1

Нечетный, что именно NULL? Context.User? Он должен быть определен в этой точке жизненного цикла ASP.NET. –

+0

Да, Context.User имеет значение null. –