在尝试DataProtectionProvider
手动创建时,我偶然发现了 Microsoft 文档,DpapiDataProtectionProvider
其中说:
用于提供源自数据保护 API 的数据保护服务。当您的应用程序不是由 ASP.NET 托管并且所有进程都以相同的域身份运行时,它是数据保护的最佳选择。
突然出现一个问题:当您的应用程序由 ASP.NET 托管时,最好的选择是什么?
进一步搜索,似乎最好的选择是DataProtectionProvider
从 OWIN 获得。这可以在启动配置中完成,您可以在其中拥有IAppBuilder
和使用AppBuilderExtensions
位于Microsoft.Owin.Security.DataProtection
命名空间中的名称,您可以调用app.GetDataProtectionProvider()
.
到目前为止,我还是很满意的。但是,现在您想DataProtectionProvider
在类的构造函数中注入 (例如 a UserManager
)。我看到了一个建议,您将其存储DataProtectionProvider
在静态属性中,然后在需要的地方使用它,但这似乎是一个相当错误的解决方案。
我认为类似于以下代码的解决方案是合适的(使用 ninject 容器):
kernel.Bind<IDataProtectionProvider>()
// beware, method .GetDataProtectionProvider() is fictional
.ToMethod(c => HttpContext.Current.GetOwinContext().GetDataProtectionProvider())
.InRequestScope();