繁体   English   中英

如何在ASP.NET Core中使用IAsyncAuthorizationFilter获取依赖项注入

[英]How to get dependency injection working with IAsyncAuthorizationFilter in ASP.NET Core

我已经将IAsyncAuthorizationFilter接口实现为一个类; 另外,该类是从Attribute派生的,因此我可以使用它来标记控制器类和操作方法。 到目前为止,该方法有效; 在操作方法之前调用Task OnAuthorizationAsync(AuthorizationFilterContext context)方法,如果请求未通过身份验证,则返回HTTP 401作为响应。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class CustomAuthenticationAttribute : Attribute, IAsyncAuthorizationFilter 
{
    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        ...
    }
}

该属性的用法如下...

[CustomAuthenticationAttribute]
public class SomeDataController : Controller
{
    [HttpGet]
    public async Task GetData()
    {
        ...
    }
}

现在,我想使用应用程序服务(该服务从数据库中获取身份验证所需的秘密私钥信息),并尝试为此使用属性注入。 通过ctor注入依赖不是一个好的选择,因为它是作为属性实现的。 所以我尝试了...

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class CustomAuthenticationAttribute : Attribute, IAsyncAuthorizationFilter 
{
    public IPrivateKeyLookupService KeyService { get; set; }

    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        string publicKey = ...
        ...
        var privateKey = await this.KeyService.GetPrivateKeyFrom(publicKey);
        ...
    }
}

...但是财产注入似乎在这里不起作用。 该服务已在IoC中注册,但属性未连接。 这是我使用Autofac的ASP.NET Core 1.1项目。 Startup类中,我的ConfigureServices方法具有类似的内容...

public void ConfigureServices(IServicesCollection collection)
{
    ...

    var containerBuilder = new ContainerBuilder();
    containerBuilder.RegisterType<AuthKeyService>().As<IPrivateKeyLookupService>();

    containerBuilder.Populate(services);

    this.container = containerBuilder.Build();
}

Autofac是否支持IAsyncAuthorizationFilter类型的自动IAsyncAuthorizationFilter 如果没有,我该如何填充该功能?

事实证明非常简单...

ASP.NET CoreTypeFilter属性,它也是一个过滤器,它创建另一个过滤器(由Type指定)并通过涉及依赖项注入来满足其构造函数参数。

我更改了IAsyncAuthorizationFilter的实现; 删除了属性并添加了一个ctor,因为使用TypeFilter ctor注入现在可以工作了...

public sealed class CustomAuthenticationAttribute : IAsyncAuthorizationFilter 
{
    private readonly IPrivateKeyLookupService keyService;
    public CustomAuthenticationAttribute(
        IPrivateKeyLookupService keyService)
    {
        this.keyService = keyService;
    }

    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        ...
    }
}

我还从Attribute删除了继承,因为不再需要继承以及AttributeUsage属性的声明。

因此,我可以如下使用我的属性...

[TypeFilter(typeof(CustomAuthenticationAttribute))]
public class SomeDataController : Controller
{
    [HttpGet]
    public async Task GetData()
    {
        ...
    }
} 

也可以通过TypeFilter类的object[] Arguments属性将其他参数传递给过滤器的ctor。

暂无
暂无

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

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