Войти в базу данных при сбое авторизации в веб-API [Net.Core]

У меня есть веб-API .Net Core с настраиваемой авторизацией на основе политик (политики, которые проверяют утверждения и значения заявлений на JWT).

Мне нужно регистрироваться (в базе данных) каждый раз, когда пользователь вызывает функцию веб-API, даже если авторизация не выполняется (особенно при сбоях).

Для этого я переопределяю эти методы OnActionExecuting и OnResultExecuted (потому что я хочу регистрировать каждый запрос в одном фильтре, а в другом фильтре - результат запроса). Но, если авторизация не удалась, оба фильтра никогда не сработали.

Это потому, что фильтр авторизации идет перед другими фильтрами (и, если запрос неавторизован, закоротите конвейер).

Итак, когда пользователь вызывает метод без авторизации, я не могу его зарегистрировать (я использую Serilog для записи файла журнала на сервере и отлично работает при сбое авторизации, но я хочу записать его в базу данных, как при авторизации Это хорошо).

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

Я все это читал, но пока не понял:

Спасибо!


person Johna    schedule 30.01.2017    source источник


Ответы (2)


Пробовали ли вы следующие варианты:

Использование глобального фильтра, в котором вы переопределяете порядок, например:

public void ConfigureServices(IServiceCollection services)
{

    services
        .AddMvc(options =>
            {
                options.Filters.Add(typeof(MyLoggingFilter), -2);
                options.Filters.Add(typeof(MyAuthFilter), -1);
            });
}

Для фильтров на основе атрибутов можно реализовать IOrderedFilter

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]
internal sealed class MyAuthorizationAttribute : Attribute, IAuthorizationFilter, IOrderedFilter
{
    public int Order => -2;
}

Добавить регистратор в сам AuthFilter

public MyAuthFilter(ILoggerFactory loggerFactory)
{
    _logger = loggerFactory.CreateLogger<MyAuthFilter>();
}
person Fionn    schedule 31.01.2017
comment
Я не знал, что порядок фильтров можно изменить, спасибо @Fionn, я попробую это (и тоже вставлю логгер) - person Johna; 31.01.2017
comment
Проблема в том, что у меня нет собственного AuthFilter, я добавляю авторизацию как сервисы не в опциях MVC (services.AddAuthorization (options = ›{options.AddPoliciy (что-то использующее утверждения JWT)})), что-то вроде это - person Johna; 31.01.2017
comment
Я не слишком хорошо знаком с авторизацией утверждений MVC, но вы можете попробовать вставить фильтр или промежуточное ПО до запуска встроенных обработчиков, - person Fionn; 31.01.2017
comment
Спасибо @Fionn, то есть я создал промежуточное ПО и вставил его перед аутентификацией - person Johna; 01.02.2017

Похоже, вы хотите войти выше в конвейер .NET? Вы могли бы взглянуть на класс DelegatingHandler, а не на фильтры. Эти обработчики выполняются намного выше в конвейере, до ваших фильтров аутентификации.

public class MyLogMessageHandler : DelegatingHandler
{
    protected override async System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {

      // Do logging with request or HttpContext.Current

    }
}

Затем в вашем global.asax.cs (или эквиваленте) u зарегистрирует обработчик:

GlobalConfiguration.Configuration.MessageHandlers.Add (новый MyLogMessageHandler ());

Взгляните на Когда использовать HttpMessageHandler против ActionFilter?

Кроме того, у нас есть решение для ведения журналов и аналитики API, которое может быть полезно, особенно если вы используете Azure, поскольку существует расширение Azure. https://www.moesif.com/features (полное раскрытие информации, я генеральный директор)

person Derrick    schedule 31.01.2017
comment
Спасибо, @Derric, я попробую (я не использую Azure) - person Johna; 31.01.2017
comment
еще раз спасибо, это то, что я хочу. Я попытался использовать DelegatingHanlder (ссылка, которую вы предоставили, очень полезна!), Затем я понял, что в .Net Core вместо HTTP-обработчика используется Промежуточное ПО. Итак, я создал промежуточное ПО, такое как this, и мне нужно тестируйте еще, но работает :) - person Johna; 31.01.2017