Как внедрить службу приложения в AuthenticationHandler - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть пользовательская реализация AuthenticationHandler<>, которая зависит от службы приложений.Есть ли способ разрешить зависимости AuthenticationHandler от простого инжектора?Или может быть межрегиональная регистрация, чтобы службы приложений могли быть разрешены из IServiceCollection?

Пример реализации для простоты может выглядеть следующим образом:

public class AuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
    private readonly ITokenDecryptor tokenDecryptor;

    public SecurityTokenAuthHandler(ITokenDecryptor tokenDecryptor,
        IOptionsMonitor<AuthenticationSchemeOptions> options, 
        ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) :
        base(options, logger, encoder, clock) =>
        this.tokenDecryptor = tokenDecryptor;

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync() =>
        return tokenDecryptor.Decrypt(this);
}

...

services.AddAuthentication("Scheme")
    .AddScheme<AuthenticationSchemeOptions, AuthHandler>("Scheme", options => { });

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

services.AddTransient(provider => container.GetInstance<ITokenDecryptor>());

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Дао ответ правильный.Самый простой способ реализовать это - подключить AuthHandler к простому инжектору.

Это можно сделать следующим образом:

// Your original configuration:
services.AddAuthentication("Scheme")
    .AddScheme<AuthenticationSchemeOptions, AuthHandler>("Scheme", options => { });

// Cross-wire AuthHandler; let Simple Injector create AuthHandler.
// Note: this must be done after the call to AddScheme. Otherwise this registration
// won't be picked up by ASP.NET.
services.AddTransient(c => container.GetInstance<AuthHandler>());

// Register the handler with its dependencies (in your case ITokenDecryptor) with 
// Simple Injector
container.Register<AuthHandler>();
container.Register<ITokenDecryptor, MyAwesomeTokenDecryptor>(Lifestyle.Singleton);
0 голосов
/ 26 декабря 2018

может быть, кросс-проводная регистрация, чтобы службы приложений могли быть разрешены из IServiceCollection?

Нет, .Net Core не может автоматически разрешить службу из Simple Injector.

Перекрестное подключение - односторонний процесс.Используя AutoCrossWireAspNetComponents, система конфигурации ASP.NET не будет автоматически разрешать отсутствующие зависимости от Simple Injector.Когда компонент приложения, составленный с помощью Simple Injector, необходимо внедрить в каркас или сторонний компонент, это необходимо настроить вручную, добавив ServiceDescriptor в коллекцию IServiceCollection, которая запрашивает зависимость от Simple Injector.Однако такая практика должна быть довольно редкой.

Ссылка: Межпроводное соединение ASP.NET и сторонних сервисов .

Как указано выше, вам необходимо зарегистрировать услугу в IServiceCollection.Что вы в настоящее время реализовали.

...