简体   繁体   English

将自定义类注入AuthorizationHandler时发生异常

[英]Exception on injecting custom class to AuthorizationHandler

I have a custom policy to check some authorization. 我有一个自定义策略来检查一些授权。

Startup.cs: Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IPermissionsManager, PermissionsManager>();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("HasPermission",
            policy => policy.Requirements.Add(new CheckProjectAccessLevelRequirement()));
    });

    services.AddSingleton<IAuthorizationHandler, CheckProjectAccessLevelHandler>();
}

Inside the CheckProjectAccessLevelHandler I want to make use of the PermissionsManager. 在CheckProjectAccessLevelHandler内部,我想利用PermissionsManager。

public class CheckProjectAccessLevelHandler : AuthorizationHandler<CheckProjectAccessLevelRequirement>
{
    readonly AuthHandlersContext _dbAuthContext;
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly PermissionsManager _permissionsManager;

    public CheckProjectAccessLevelHandler(AuthHandlersContext context, UserManager<ApplicationUser> userManager, PermissionsManager permissionsManager)
    {
        _dbAuthContext = context;
        _userManager = userManager;
        _permissionsManager = permissionsManager;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CheckProjectAccessLevelRequirement requirement)
    {
        _permissionsManager.doStuff()
    }
}

But I get this exception: 但是我得到这个异常:

System.InvalidOperationException: Unable to resolve service for type 'myProject.Services.PermissionsManager' while attempting to activate 'myProject.Services.AuthHandlers.CheckProjectAccessLevelHandler'.

Without the injection of the PermissionsManager everything works as expected. 没有注入PermissionsManager,一切都会按预期进行。

What do I miss? 我想念什么?

You registered IPermissionManager (with services.AddTransient<IPermissionsManager, PermissionsManager>(); ) to be resolvable, so you should change ctor parameter to IPermissionsManager too: IPermissionManager (使用services.AddTransient<IPermissionsManager, PermissionsManager>(); )注册为可解析的,因此也应将ctor参数更改为IPermissionsManager

public CheckProjectAccessLevelHandler(
    AuthHandlersContext context, 
    UserManager<ApplicationUser> userManager, 
    IPermissionsManager permissionsManager) // <-- here
{
    ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM