尝试手动创建DataProtectionProvider
时,我偶然发现了DpapiDataProtectionProvider
的Microsoft文档,其中说:
用于提供从中派生的数据保护服务 数据保护API。 当您使用时,它是数据保护的最佳选择 应用程序不是由ASP.NET 托管,并且所有进程都以 相同的域名。
突然出现一个问题:当您的应用程序由ASP.NET托管时,最佳选择是什么?
进一步搜索,似乎最好的选择是从OWIN获取DataProtectionProvider
。这可以在启动配置中完成,您可以IAppBuilder
使用位于AppBuilderExtensions
命名空间中的Microsoft.Owin.Security.DataProtection
来调用app.GetDataProtectionProvider()
。
到目前为止,我很满意。但是,现在您要在类的构造函数中注入DataProtectionProvider
(例如UserManager
)。我已经看到one suggestion将DataProtectionProvider
存储在静态属性中,然后在需要的地方使用它,但这似乎是一个相当错误的解决方案。
我认为类似于以下代码的解决方案是合适的(使用ninject容器):
kernel.Bind<IDataProtectionProvider>()
// beware, method .GetDataProtectionProvider() is fictional
.ToMethod(c => HttpContext.Current.GetOwinContext().GetDataProtectionProvider())
.InRequestScope();
答案 0 :(得分:1)
有walkthrough告诉您如何使用Autofac注册DataProtectionProvider。
builder.Register<IDataProtectionProvider>(c => app.GetDataProtectionProvider()).InstancePerRequest();
答案 1 :(得分: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的类,如果你愿意,它更清洁。