dependency-injection - 将 UserManager 传递给 ConfigureServices MVC 6 中的 AuthorizationHandler

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

给定以下带有 DI 的 UserManager 类

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 中实例化它但看起来我需要提供用户管理器。即责任似乎回到了调用者身上。

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

我想我认为 AuthorizationHandler 会神奇地解决依赖关系本身

我该怎么做

谢谢

最佳答案

tldr;

您使用了错误的重载。

尝试这样的事情:

services.AddTransient<IAuthorizationHandler, AccountAuthorizationHandler>();

在依赖注入(inject)中,有许多不同的概念,您使用的相当于单例。

关于依赖注入(inject)的更多细节

辛格尔顿

有两种方法可以使用 ASP.NET 依赖注入(inject)来声明单例。

要么您自己为实例提供 services.AddInstance<T>(...)或者您让系统为您构建它并控制它的生命周期,以便构建这个单一实例。

这样做是这样的:

services.AddSingleton<TInterface, TImplementation>()

transient 生命周期

每次请求这种类型的依赖时,它都会 new再次抬起对象。没有两个实例是相等的,因为它们总是会被重新创建。

services.AddTransient<TInterface, TImplementation>()

范围

那时,我们为每个请求请求一个对象。它是 Transient 和 Singleton 的混合体,但我们只会使用 new每个 HTTP 请求的对象一次。

services.AddScoped<TInterface, TImplementation>()

结论

依赖注入(inject)从一开始就内置在框架中。从安全性到模型绑定(bind)的一切都可以通过正确的接口(interface)和正确的生命周期来重载。

在过快之前,您应该花一点时间重新了解依赖注入(inject)的知识。如果没有足够的时间,请使用本文中提供的信息。这足以让你开始。

关于dependency-injection - 将 UserManager 传递给 ConfigureServices MVC 6 中的 AuthorizationHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34359075/

相关文章:

asp.net - 将MVC5项目升级到MVC6

java - 在 Guice 中向所有提供者请求绑定(bind)接口(interface)

c# - 在 ASP.NET Core 中到达 Controller 之前拦截不良请求

c# - 在 ASP.NET Core 1.0 中使用 ModelState 和 RedirectToAction 进行异步

security - 在域对象中强制执行属性级授权

javascript - 编写 JavaScript 库 : how to authorize methods?

ruby-on-rails - 为路由添加授权

c# - 具有依赖注入(inject)的 UserControl 无法创建组件

java - Spring 注解@Autowired 内部方法

android - 出于某种原因,Dagger 没有构建模块