2012-05-10 2 views
1

Я пытаюсь создать лучший способ войти попытку несанкционированного доступа к контроллеру/Action с .net MVC, в основном требованиями являются:Logging/Аудит 403 Запросы

  1. Если они не вошли в систему то мы хотим перенаправить их на страницу входа в систему.
  2. Если они вошли в систему, но не имеют необходимых учетных данных для страницы, тогда мы хотим зарегистрировать информацию о запросе, кто они такие, какие-то материалы HttpRequest и т. д., затем перенаправить их на страницу несанкционированного доступа.

1, очевидно, обрабатывается по умолчанию с помощью фильтров атрибутов .net mvc [Authorize]. 2 Я частично реализовал, я создал специальный атрибут авторизации, который расширяет фильтр действия авторизации, который переопределяет метод HandleUnauthorizedRequest по умолчанию, чтобы проверить несколько дополнительных вещей и вернуть HttpResult с кодом ответа 403.

Я не имея проблем с реализацией другой части этого, ведение журнала информации в базе данных. Конечно, это простое решение для входа в него из самого настраиваемого атрибута, но это не кажется правильным, похоже, что я делаю этот атрибут более умным, тогда он должен быть, в конце концов, он должен просто знать об ограничении доступа, а не о регистрации информации в базе данных.

Существует еще одно решение, регистрирующее его, когда оно попадает на страницу несанкционированного доступа, которая не чувствует себя так же плохо, но все еще не совсем корректна.

Лично я хотел бы иметь возможность обрабатывать его где-то в цепочке запросов, но насколько я могу судить, нет места, где у меня есть доступ ко всей необходимой информации. Я пробовал оглянуться, но не нашел ничего, что вполне соответствует решению, которое мы собираемся сделать.

Кто-нибудь там реализовал нечто похожее на то, что мы собираемся или какие-либо идеи относительно того, где это должно быть реализовано.

Спасибо, MD

ответ

2

Создать новую IHttpModule и регистрировать обманывающий хакер на EndRequest события ...

Э.Г.

public class UnAuthorizedLoggerHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.EndRequest += ContextOnEndRequest; 
    } 

    private void ContextOnEndRequest(object sender, EventArgs eventArgs) 
    { 
     var app = sender as HttpApplication; 

     if (app == null) return; 

     if (app.Response.StatusCode == (int)HttpStatusCode.Forbidden) 
     { 
      //Log the error 
      //All the user info should be in app.Request 
     } 
    } 
} 
+0

Это блестяще, именно то, что мы ищем! – MDo

Смежные вопросы