クラスに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
サポート自動配線をしていますか?もしそうでなければ、どうすればその機能をポリフィルすることができますか?
代わりに '[TypeFilter(typeof(CustomAuthenticationAttribute)]]を使用してコントローラにフィルタを登録しようとしましたか?ここで詳しい情報を入手できます:https://joonasw.net/view/aspnet-core-di-deep-dive – juunas
@juunasありがとう;数分前にその解決策を見つけました。それは典型的なものです...私は何時間も探していました。 – Matze