6

手動で作成しようとするとDataProtectionProvider、マイクロソフトのドキュメントに出くわしましDpapiDataProtectionProviderた。

Data Protection API から派生したデータ保護サービスを提供するために使用されます。アプリケーションが ASP.NET によってホストされておらず、すべてのプロセスが同じドメイン ID として実行されている場合、これはデータ保護の最良の選択です。

突然疑問が生じます。アプリケーションが ASP.NET によってホストされている場合、どの選択肢が最適でしょうか?

DataProtectionProviderさらに検索すると、OWIN からを取得するのが最善の選択のようです。これは、呼び出し可能な名前空間IAppBuilderAppBuilderExtensionsあるスタートアップ構成で行うことができます。Microsoft.Owin.Security.DataProtectionapp.GetDataProtectionProvider()

これまでのところ、私はかなり満足しています。DataProtectionProviderただし、クラスのコンストラクター (たとえば a )に を注入する必要がありますUserManager。を静的プロパティに格納し、必要な場所で使用するという提案を見DataProtectionProviderたことがありますが、それはかなり間違った解決策のようです。

次のコードのようなソリューションが適切だと思います (ninject コンテナーを使用):

kernel.Bind<IDataProtectionProvider>()
    // beware, method .GetDataProtectionProvider() is fictional
    .ToMethod(c => HttpContext.Current.GetOwinContext().GetDataProtectionProvider())
    .InRequestScope();
4

2 に答える 2

4

DataProtectionProvider を Autofac に登録する方法を説明するウォークスルーがあります。

builder.Register<IDataProtectionProvider>(c => app.GetDataProtectionProvider()).InstancePerRequest();
于 2016-04-07T11:26:04.590 に答える
0

次の行を使用して、Unity でこれを実現することもできます。

container.RegisterType<IDataProtectionProvider>(new InjectionFactory(c => app.GetDataProtectionProvider()));

コンテナの場所

var container = new UnityContainer();

これにより、次のようにコンストラクターで DataProtectionProvider を使用できるようになります。

public ApplicationUserManager(IUserStore<ApplicationUser> store, IIdentityMessageService emailService, IDataProtectionProvider dataProtectionProvider)

このブログ記事https://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/で言及されているアプローチよりも、このアプローチを好みます。必要に応じて、別のライブラリで DataProtectionProvider を使用すると、はるかにクリーンになります。

于 2018-06-06T12:47:48.187 に答える