Разрешить зависимости для обработчика событий аутентификации через DI - PullRequest
0 голосов
/ 23 сентября 2018

Я использую токены-носители JWT для защиты моего веб-API ASP.NET Core 2.1.Во время ConfigureServices я настраиваю аутентификацию и связываю объект JwtBeaererEvents с помощью опций для дополнительной обработки.Я хотел бы, чтобы этот объект был частью контейнера DI, но я не уверен, как это сделать.Сейчас я должен создать экземпляры и пропустить их через конструктор (анти-шаблон).Но это создаст сценарий с курицей и яйцом:

/* HACK */
var sp = services.BuildServiceProvider();

services.AddAuthentication(opts =>
{
    opts.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(opts =>
{                
    opts.Audience = "https://foobar.com/FooAPI";
    opts.Authority = Constants.AuthEndpointPrefix + "common/";
    opts.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false };

    /* I would like JwtBearerEvents to be part of the 
       DI container and request the Logger and AppInsights 
       Dependency through the ctor 
    */
    opts.Events = new 
       JwtBearerEvents(
          LoggerFactory.CreateLogger<JwtBearerEvents>(),
          sp.GetService<TelemetryClient>() 
       );  
    });     

1 Ответ

0 голосов
/ 24 сентября 2018

Система аутентификации в ASP.NET Core 2 поддерживает это изначально, используя свойство EventsType параметров схемы аутентификации:

services.AddTransient<MyJwtBearerEvents>();
services.AddAuthentication()
    .AddJwtBearer(options =>
    {
        options.EventsType = typeof(MyJwtBearerEvents);
    });

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

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

...