На что был бы похож класс Обертки Log4Net?

Есть несколько причин, чтобы сделать недействительным токен JWT до истечения срока его действия: учетная запись удалена / заблокирована / приостановлена, изменен пароль, изменены права доступа, пользователь вышел из системы администратором. Итак, ваш вопрос по теме

Существует несколько методов применения или объединения в зависимости от вашего варианта использования

1) Удалить токен клиента из локального хранилища

2 ) Token blacklist: хранить токены, которые были между выходом и amp; время истечения срока действия, срок действия истек и проверить его в каждом запросе. Используйте уникальный идентификатор jti или включите последнюю дату входа и выданную в iat для удаления старых токенов

Это необходимо для хранения сервера. Если вы не ожидаете, что слишком много токенов отменят, вы также можете использовать черный список в памяти. Вам нужно только установить запись после обновления важных данных для пользователя и currentTime - maxExpiryTime < lastLoginDate (iat)‌. Запись может быть отброшена, если currentTime - maxExpiryTime > lastModified (не больше не просроченных токенов). В этом случае не требуется хранить весь токен. Только sub, iat и, возможно, jti

3) Время истечения кратковременно и повернуть их. Выпустите новый токен доступа каждые несколько запросов. Используйте токены обновления , чтобы ваше приложение могло получать новые токены доступа, не требуя повторной аутентификации и объединения с sliding-sessions

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

Другие распространенные методы

  • Разрешить изменение уникального идентификатора пользователя, если учетная запись скомпрометирована с новым именем пользователя и входа в систему
  • Чтобы недействить токены, когда пользователь меняет свой пароль, подпишите токен с хешем своего пароля. Если пароль изменяется, все предыдущие токены автоматически не проверяются. Расширьте этот механизм с другим интересующим знаком знаком. Недостатком является то, что он требует доступа к базе данных
  • Изменить алгоритм подписи для отмены всех текущих токенов в основных проблемах безопасности

Взгляните на Недействительный JSON Web Лексемы

56
задан Zaid Masud 23 August 2012 в 10:09
поделиться

6 ответов

По существу Вы создаете интерфейс и затем конкретную реализацию того интерфейса, который обертывает классы и методы Log4net непосредственно. Дополнительные системы регистрации могут быть обернуты путем создания более реальных классов, которые обертывают другие классы и методы тех систем. Наконец используйте фабрику для создания экземпляров оберток на основе параметра конфигурации или строки изменения кода. (Отметьте: можно стать более гибкими - и комплекс - использование Инверсия Управления контейнер такой как StructureMap.)

public interface ILogger
{
    void Debug(object message);
    bool IsDebugEnabled { get; }

    // continue for all methods like Error, Fatal ...
}

public class Log4NetWrapper : ILogger
{
    private readonly log4net.ILog _logger;

    public Log4NetWrapper(Type type)
    {
        _logger = log4net.LogManager.GetLogger(type);
    }

    public void Debug(object message)
    {
        _logger.Debug(message);
    }

    public bool IsDebugEnabled
    {
        get { return _logger.IsDebugEnabled; }
    }

    // complete ILogger interface implementation
}

public static class LogManager
{
    public static ILogger GetLogger(Type type)
    {
        // if configuration file says log4net...
        return new Log4NetWrapper(type);
        // if it says Joe's Logger...
        // return new JoesLoggerWrapper(type);
    }
}

И пример использования этого кода в Ваших классах (объявленный как статическое поле только для чтения):

private static readonly ILogger _logger =
    LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

можно получить то же немного больше производительности дружественное использование эффекта:

private static readonly ILogger _logger = 
    LogManager.GetLogger(typeof(YourTypeName));

Бывший пример считают более удобным в сопровождении.

Вы не хотели бы создавать Singleton для обработки всего входа, потому что Log4Net регистрируется для типа вызова; его намного более чистый и полезный для имения каждого типа используют его собственный регистратор вместо того, чтобы просто видеть единственный тип в файле журнала, сообщая обо всех сообщениях.

, поскольку Ваша реализация должна быть довольно допускающей повторное использование (другие проекты в Вашей организации) Вы могли сделать ее ее собственным блоком или идеально включать ее с Вашим собственным персональным блоком платформы/утилиты / блоком платформы/утилиты организации. Не повторно объявляйте классы отдельно в каждом из Ваших блоков бизнеса/данных/UI, это не удобно в сопровождении.

51
ответ дан cfeduke 26 November 2019 в 17:27
поделиться

Принятие Вас шло с чем-то как ответ cfeduke выше , Вы могли также добавить перегрузку к Вашему LogManager как это:

public static ILogger GetLogger()
{
    var stack = new StackTrace();
    var frame = stack.GetFrame(1);
    return new Log4NetWrapper(frame.GetMethod().DeclaringType);
}

Тот путь в Вашем коде можно теперь просто использовать:

private static readonly ILogger _logger = LogManager.GetLogger();

вместо любого из них:

private static readonly ILogger _logger =
    LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static readonly ILogger _logger = 
    LogManager.GetLogger(typeof(YourTypeName));

, Который эффективно эквивалентен из первой альтернативы (т.е. тот, который использует MethodBase.GetCurrentMethod().DeclaringType), только немного более простой.

24
ответ дан Community 26 November 2019 в 17:27
поделиться

Какие преимущества - Вы планирование выхода из записи обертки для log4net. Я рекомендовал бы стать довольным log4net классами сначала прежде, чем записать обертку вокруг них. cfeduke является правильным в его ответе о том, как записать, сказала обертка, но если Вы не должны добавлять фактическую функциональность к его примеру, обертка только преуспела бы в том, чтобы замедлить процесс входа и добавление сложности для будущих специалистов по обслуживанию. Это особенно верное при рефакторинге инструментов, доступных в.Net, делает такие изменения супер легкими.

5
ответ дан 26 November 2019 в 17:27
поделиться

Мое понимание - то, что класс обертки для log4net был бы статическим классом, который заботится об инициализации регистрирующегося объекта от app.config/web.config или кодом (например, интеграция с NUnit).

0
ответ дан devio 26 November 2019 в 17:27
поделиться

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

0
ответ дан Joachim Kerschbaumer 26 November 2019 в 17:27
поделиться

Альконья, мне нравится твоя идея использовать трассировку стека для возврата к вызывающему методу. Я думал о дальнейшей инкапсуляции вызовов, чтобы не просто получить объект регистратора, но и выполнить собственно регистрацию. Мне нужен статический класс, который обрабатывает ведение журнала, абстрагируясь от конкретной используемой реализации. Т.е.

LoggingService.LogError("my error message");

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

Итак, я использовал вашу идею, чтобы получить вызывающий объект с помощью трассировки стека:

public static class LoggingService
{
    private static ILog GetLogger()
    {    
        var stack = new StackTrace();    
        var frame = stack.GetFrame(2);    
        return log4net.LogManager.GetLogger(frame.GetMethod().DeclaringType);
    }

    public static void LogError(string message)
    {
        ILog logger = GetLogger();
        if (logger.IsErrorEnabled)
            logger.Error(message);
    }
    ...
}

Кто-нибудь видит проблему с этим подходом?

0
ответ дан 26 November 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: