c# - 如何将应用程序服务注入(inject) AuthenticationHandler

标签 c# asp.net-core simple-injector

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

最佳答案

我正在使用 .Net 5 Steven提供的原件从旧的 .net 核心应用程序升级后,我不再为我工作。我不得不:

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddAuthentication("MyScheme")
        .AddScheme<ApiKeyOptions, ApiKeyAuthenticationHandler>("MyScheme", o => { });

    var authHandlerDescriptor = services
        .First(s => s.ImplementationType == typeof(ApiKeyAuthenticationHandler));

    services.Remove(authHandlerDescriptor);

    services.AddTransient(c => container.GetInstance<ApiKeyAuthenticationHandler>());
}

关于c# - 如何将应用程序服务注入(inject) AuthenticationHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53922411/

相关文章:

configuration - 如何将配置参数传递给 SimpleInjector 打包?

c# - 使用多个构造函数注册开放泛型的简单注入(inject)器

c# - 回复 Mailkit 中的邮件

sql-server - 升级 Microsoft.EntityFrameworkCore.SqlServer 版本时出错

c# - 领域模型及相关数据(贫血领域模型)

interface - 为什么 ASP.NET Core 中的中间件需要特定的语义,而不是接口(interface)?

simple-injector - SimpleInjector 延迟注册所有

c# - 在静态类中引发事件

c# - 从图像中删除所有水平和垂直线

c# - MVVM:仅将Messenger与自定义对象一起使用以使Send <> “id”唯一吗?