6

在尝试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();
4

2 回答 2

4

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

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 回答