首页 > 解决方案 > 如何将应用程序服务注入 AuthenticationHandler

问题描述

我有一个AuthenticationHandler<>依赖于应用程序服务的自定义实现。有没有办法解决AuthenticationHandlerSimple Injector 的依赖关系?或者可能是跨线注册,以便可以解决应用程序服务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>());

标签: c#asp.net-coresimple-injector

解决方案


陶的回答是对的。实现这一点的最简单方法是将连接AuthHandlerSimple Injector。

这可以按如下方式完成:

// 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 it will
// be overridden 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);

推荐阅读