将UserManager传递给ConfigureServices MVC 6中的AuthorizationHandler

时间:2015-12-18 15:37:14

标签: dependency-injection authorization asp.net-core-mvc

给出以下用于UserManager的DI的类

public class AccountAuthorizationHandler : AuthorizationHandler<OperationAuthorizationRequirement, AuthorisedAccount>
{
    private readonly UserManager<ApplicationUser> userManager;
    public AccountAuthorizationHandler(UserManager<ApplicationUser> userManager)
    {
        this.userManager = userManager;
    }
    protected override void Handle(AuthorizationContext context,
                                   OperationAuthorizationRequirement requirement,
                                   AuthorisedAccount resource)
    {
        // Pull the user ID claim out from the context.User
        var userId = context.User.GetUserId();
        // Get the current user's account numbers.       
        var user = userManager.Users
            .Include(u => u.AuthorisedAccounts)
            .Where(u => u.Id == userId)
            .FirstOrDefault();

        //Now check if the user's account numbers match the resource accountNumber, and 
        foreach( var authorizedAccount in user.AuthorisedAccounts)
        { 
            if ((resource.AccountNo == authorizedAccount.AccountNo) &&
                (requirement == Operations.Read))
            context.Succeed(requirement);
        }

    }
}

我想在ConfigureServices中实例化它,但看起来我需要提供Usermanager。即责任似乎又回到了来电者身上。

services.AddInstance<IAuthorizationHandler>
    (new AccountAuthorizationHandler(I want to add UserManager here));

我想我认为AuthorizationHandler会解决依赖本身

如何进行此操作

由于

1 个答案:

答案 0 :(得分:6)

tldr;

您使用了错误的重载。

尝试这样的事情:

services.AddTransient<IAuthorizationHandler, AccountAuthorizationHandler>();

在依赖注入中,有许多不同的概念,你使用的是等效的单例。

有关依赖注入的更多详细信息

的Singleton

使用ASP.NET依赖注入声明单例的两种方法。

您自己使用services.AddInstance<T>(...)提供实例,或者让系统为您构建实例并控制其生命周期,以便构建此单个实例。

这样做是这样的:

services.AddSingleton<TInterface, TImplementation>()

瞬态寿命

每次请求此类型的依赖项时,它将再次new向上对象。没有两个实例是平等的,因为它们将永远被重建。

services.AddTransient<TInterface, TImplementation>()

作用域

此时,我们正在请求每个请求一个对象。它是Transient和Singleton的混合,但我们每个HTTP请求只会转发new一次对象。

services.AddScoped<TInterface, TImplementation>()

结论

依赖注入从一开始就构建在框架中。从安全性到模型绑定的所有东西都可以通过正确的界面和正确的生命周期来重载。

在过快之前,您应该花点时间刷新您对依赖注入的知识。如果时间不够,请使用此帖子中提供的信息。 足够好让你入门。