正确获取MVC 5中的DataProtectionProvider以进行依赖注入

Get DataProtectionProvider in MVC 5 for dependecy injection correctly

在尝试手动创建 DataProtectionProvider 时,我偶然发现了 DpapiDataProtectionProvider 的 Microsoft 文档,上面写着:

Used to provide the data protection services that are derived from the Data Protection API. It is the best choice of data protection when you application is not hosted by ASP.NET and all processes are running as the same domain identity.

突然出现一个问题:当您的应用程序由 ASP.NET 托管时,最佳选择是什么?

进一步搜索,似乎最好的选择是从 OWIN 获取 DataProtectionProvider。这可以在启动配置中完成,您有 IAppBuilder 并使用位于 Microsoft.Owin.Security.DataProtection 命名空间中的 AppBuilderExtensions,您可以调用 app.GetDataProtectionProvider().

到目前为止,我还是比较满意的。但是,现在您想在 class(例如 UserManager)的构造函数中注入 DataProtectionProvider。我看到 one suggestionDataProtectionProvider 存储在静态 属性 中,然后在需要的地方使用它,但这似乎是一个相当错误的解决方案。

我认为类似于以下代码的解决方案是合适的(使用 ninject 容器):

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

有一个 walkthrough 告诉您如何使用 Autofac 注册 DataProtectionProvider。

builder.Register<IDataProtectionProvider>(c => app.GetDataProtectionProvider()).InstancePerRequest();

您也可以通过以下行使用 Unity 实现此目的:

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

容器在哪里

var container = new UnityContainer();

这将允许您在构造函数中使用 DataProtectionProvider,如下所示。

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

比起此博客 post 此处 https://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/ 中提到的方法,我更喜欢这种方法,只是因为它允许您在单独的库中使用 DataProtectionProvider 类,如果您会喜欢,而且干净多了。