我有一个自定义 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/