Asp.net mvc 在MVC 5中正确获取依赖注入的DataProtectionProvider

Asp.net mvc 在MVC 5中正确获取依赖注入的DataProtectionProvider,asp.net-mvc,dependency-injection,owin,owin-security,Asp.net Mvc,Dependency Injection,Owin,Owin Security,在尝试手动创建DataProtectionProvider时,我偶然发现了一个Microsoft文档,其中写道: 用于提供从中派生的数据保护服务 数据保护API当您需要时,它是数据保护的最佳选择 应用程序不是由ASP.NET托管的,所有进程都以 相同的域标识 突然出现了一个问题:当应用程序由ASP.NET托管时,什么是最佳选择? 进一步搜索,似乎最好的选择是从OWIN获取DataProtectionProvider。这可以在启动配置中完成,在启动配置中,您有IAppBuilder并使用Micro

在尝试手动创建
DataProtectionProvider
时,我偶然发现了一个Microsoft文档,其中写道:

用于提供从中派生的数据保护服务 数据保护API当您需要时,它是数据保护的最佳选择 应用程序不是由ASP.NET托管的,所有进程都以 相同的域标识

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

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

到目前为止,我很满意。但是,现在您希望将
DataProtectionProvider
注入类的构造函数中(例如
UserManager
)。我见过在静态属性中存储
DataProtectionProvider
,然后在需要的地方使用它,但这似乎是一个相当错误的解决方案

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

kernel.Bind()
//注意,方法.GetDataProtectionProvider()是虚构的
.ToMethod(c=>HttpContext.Current.GetOwinContext().GetDataProtectionProvider())
.InRequestScope();
有一个函数告诉您如何向Autofac注册DataProtectionProvider

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

您也可以通过以下几行实现这一点:

container.RegisterType<IDataProtectionProvider>(new InjectionFactory(c => app.GetDataProtectionProvider()));
这将允许您在构造函数中使用DataProtectionProvider,如下所示

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

公共应用程序服务器管理器(IUserStore,原因很简单,如果您愿意,它允许您将使用DataProtectionProvider的类放在单独的库中,而且更干净。

如果我理解正确,DI容器应该在startup类中初始化。是的,或者由
startup
类调用的类,只要它是y的一部分我们的作文来源。有人问了一个关于如何使用OWIN设置Ninject的问题(我似乎找不到它),这是一个主要的问题,因为OWIN和Ninject都希望拥有应用程序的起点。考虑到Ninject也是最慢的DI容器之一,我个人会找到一个更容易集成的不同容器。感谢您的建议,但这是一个正在进行的项目,所以更改ninje将ct转换为其他内容是一个选项,但以后可以选择。似乎正确获取它的唯一方法是使用
IAppBuilder
扩展。此答案中的链接已断开。
var container = new UnityContainer();
public ApplicationUserManager(IUserStore<ApplicationUser> store, IIdentityMessageService emailService, IDataProtectionProvider dataProtectionProvider)