关注this article我正在尝试实现自定义AuthenticationHandler,但我陷入依赖注入。
我需要将IRepository实例注入AuthenticationHandler以提供dbo连接(用于检查凭据)
代码:
public class CustomAuthenticationHandler : AuthenticationHandler<CustomAuthenticationOptions>
{
// how to inject?!
private IRepository repository;
public CustomAuthenticationHandler(IOptionsMonitor<CustomAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
: base(options, logger, encoder, clock) {
}
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
// this is just a sample
if (repository.users.Where(w => w.user_name == Request.Headers["user_name"] && w.password == Request.Headers["password"]).Count() == 1)
{
return Task.FromResult(
AuthenticateResult.Success(
new AuthenticationTicket(
new ClaimsPrincipal(Options.Identity),
new AuthenticationProperties(),
this.Scheme.Name)));
}
return Task.FromResult(
AuthenticateResult.Failed(
);
}
你有任何提示吗?
由于
答案 0 :(得分:2)
只需将存储库依赖项添加到构造函数中,在构造函数体中设置变量
public CustomAuthenticationHandler(IOptionsMonitor<CustomAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, IRepository repo)
: base(options, logger, encoder, clock) {
repository = repo;
}
答案 1 :(得分:0)
感谢。我试过杰克的解决方案,但它确实有效。
我遇到了将Repository(使用EF DataContext)依赖注入到Middleware中的巨大问题。加载Angular SPA后,它会向API发出多个并行请求。我随机获得了InvalidOperationExceptions,类似&#34; db context在创建时不能使用&#34;
在我完全无望地将依赖注入从Middleware构造函数转移到Invoke方法之前,绝对没有任何帮助:
public async Task Invoke(HttpContext context, IRepository repository)
{
...
但AuthenticationHandler似乎有不同的流程。像魅力一样。