我已經實現了IAsyncAuthorizationFilter
接口到類;此外,該類來源於Attribute
,所以我可以使用它標記控制器類和操作方法。這到目前爲止,在操作方法之前調用Task OnAuthorizationAsync(AuthorizationFilterContext context)
方法,如果請求未通過身份驗證,則返回HTTP 401
作爲響應。如何在ASP.NET Core中使用IAsyncAuthorizationFilter獲得依賴注入
[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註冊,但屬性未連線。這是一個ASP.NET Core 1.1項目,我使用Autofac
。在Startup
類我ConfigureServices
方法有類似的東西...
public void ConfigureServices(IServicesCollection collection)
{
...
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<AuthKeyService>().As<IPrivateKeyLookupService>();
containerBuilder.Populate(services);
this.container = containerBuilder.Build();
}
確實爲IAsyncAuthorizationFilter
類型Autofac
支持自動佈線?如果沒有,我怎麼能夠填充這個功能?
你試過用'[TypeFilter(typeof(CustomAuthenticationAttribute))]'在控制器上註冊你的過濾器嗎?你可以在這裏獲得更多信息:https://joonasw.net/view/aspnet-core-di-deep-dive – juunas
@juunas謝謝;幾分鐘前剛剛找到解決方案。這是典型的...我正在尋找幾個小時,然後在我問這個問題時彈出瞭解決方案( - ;)。 – Matze