2017-04-07 65 views
1

我已經實現了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支持自動佈線?如果沒有,我怎麼能夠填充這個功能?

+0

你試過用'[TypeFilter(typeof(CustomAuthenticationAttribute))]'在控制器上註冊你的過濾器嗎?你可以在這裏獲得更多信息:https://joonasw.net/view/aspnet-core-di-deep-dive – juunas

+0

@juunas謝謝;幾分鐘前剛剛找到解決方案。這是典型的...我正在尋找幾個小時,然後在我問這個問題時彈出瞭解決方案( - ;)。 – Matze

回答

2

它原來是非常簡單的...

ASP.NET Core存在TypeFilter屬性,這也是一個創建另外一個過濾器(Type指定)和涉及依賴注入滿足它的構造函數參數的過濾器。

我改變了執行IAsyncAuthorizationFilter;除去性能並增加了一個構造函數來代替,因爲TypeFilter男星注入將現在的工作......

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

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

因爲it's沒有必要了,因爲還有AttributeUsage屬性的聲明,我也是從Attribute刪除繼承。

所以,我可以用我的屬性如下...

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

傳遞額外的參數的構造函數filter's也可以通過TypeFilter類的object[] Arguments財產。