2017-04-07 10 views
1

クラスにIAsyncAuthorizationFilterインターフェイスを実装しました。さらに、そのクラスはAttributeから派生しているので、それを使ってコントローラクラスとアクションメソッドをマークすることができます。これまでのところ動作します。アクションメソッドの前にTask OnAuthorizationAsync(AuthorizationFilterContext context)メソッドが呼び出され、要求が認証されない場合は、応答としてHTTP 401が返されます。ASP.NETコアの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に登録されていますが、プロパティは配線されません。これは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(); 
} 

IAsyncAuthorizationFilterのタイプのAutofacサポート自動配線をしていますか?もしそうでなければ、どうすればその機能をポリフィルすることができますか?

+0

代わりに '[TypeFilter(typeof(CustomAuthenticationAttribute)]]を使用してコントローラにフィルタを登録しようとしましたか?ここで詳しい情報を入手できます:https://joonasw.net/view/aspnet-core-di-deep-dive – juunas

+0

@juunasありがとう;数分前にその解決策を見つけました。それは典型的なものです...私は何時間も探していました。 – Matze

答えて

2

また、(Typeで指定された)別のフィルタを作成し、依存性注入を含むことにより、そのコンストラクタの引数を満たすフィルタであるTypeFilter属性があるASP.NET Coreで...非常に単純であることを

を判明。

IAsyncAuthorizationFilterの実装を変更しました。プロパティを削除し、TypeFilter CTOR注射で今動作しますので、代わりにctorのを追加...

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

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

私もit'sはもう必要ないのでAttributeからの継承を削除だけでなく、AttributeUsage属性の宣言。

次のように、私は自分の属性を使用することができます...

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

filter'sのCTORに追加の引数を渡すには、TypeFilterクラスのobject[] Argumentsプロパティを使用しても可能です。

関連する問題