在MVC 5中获取DataProtectionProvider以正确注入依赖性

时间:2016-04-07 10:18:15

标签: asp.net-mvc dependency-injection owin owin-security

尝试手动创建DataProtectionProvider时,我偶然发现了DpapiDataProtectionProvider的Microsoft文档,其中说:

  

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

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

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

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

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

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

2 个答案:

答案 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的类,如果你愿意,它更清洁。