[英]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 Core
有TypeFilter
属性,它也是一个过滤器,它创建另一个过滤器(由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.