Шаблон для журналирования всего приложения с IP-адресом - PullRequest
2 голосов
/ 13 августа 2011

Я пишу приложение ASP.NET MVC 3 с большим количеством классов, не зависящих от веб-сайтов.Из-за строгих требований к журналу аудита все подозрительные действия должны регистрироваться с использованием идентификатора пользователя и IP-адреса.

Как обычно осуществляется регистрация такого рода?IP-адрес зарегистрирован только на контроллере входа?Если да, то как идентификатор пользователя передается во все места, где требуется регистрация?Добавление его в качестве параметра для каждого метода не является хорошей идеей.

1 Ответ

3 голосов
/ 14 августа 2011

Я предполагаю, что под идентификатором пользователя вы подразумеваете личность аутентифицированного пользователя.

Нет необходимости передавать эту информацию, поскольку она уже доступна в ваших контроллерах.

Для текущего пользователя:

User.Identity.Name

Для IP-адреса пользователя:

Request.UserHostAddress

Однако ведение журнала обычно распространяется на все приложения. Вы должны создать интерфейс регистратора, который может использоваться всеми областями вашего приложения без необходимости зависеть от System.Web.

Например:

public interface ILogger {
    void Log(string message);
}

Затем можно создать реализацию этого, которая вызывает текущий HttpContext для получения идентификатора пользователя и IP-адреса.

public class MyLogger : ILogger {

    public void Log(string message) {

        var sb = new StringBuilder();

        var context = HttpContext.Current;

        if (context != null) {
            sb.AppendLine("User: " + context.User.Identity.Name);
            sb.AppendLine("IP: " + context.Request.UserHostAddress);
        }

        sb.AppendLine("Message: " + message);

        // store the message somewhere (db, file).
        // e.g. messageRepository.Save(sb.ToString());
    }
}

Затем, когда вам нужно что-то зарегистрировать (в любом месте вашего приложения), вы просто берете зависимость от ILogger, которую ваш IoC-контейнер может внедрить для вас, а затем просто вызываете logger.Log("some message").

Да, это предполагает, что вы используете Dependency Injection и программируете по интерфейсам, но тогда вам следует:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...