ASP.NET Core AuthenticationHandler依赖注入

时间:2018-04-04 17:27:27

标签: asp.net asp.net-core

关注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(
               );
    }

你有任何提示吗?

由于

2 个答案:

答案 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似乎有不同的流程。像魅力一样。