0

我正在使用 Autofac 作为容器时新尝试加密应用程序块。

因此,我使用的是 nuget 包EntLibContrib 5.0 - Autofac Configurator

使用 DPAPI Symmetric Crypto Provider,我能够很好地加密/解密数据。

但是,使用 RijndaelManaged,我收到一个 ActivationException:

Microsoft.Practices.ServiceLocation.ActivationException:尝试获取 ISymmetricCryptoProvider 类型的实例时发生激活错误,密钥“RijndaelManaged”---> Autofac.Core.Registration.ComponentNotRegisteredException:请求的服务 'RijndaelManaged (Microsoft.Practices.EnterpriseLibrary.Security. Cryptography.ISymmetricCryptoProvider)' 尚未注册。为避免此异常,请注册组件以提供服务,使用 IsRegistered() 检查服务注册,或使用 ResolveOptional() 方法解决可选依赖项。

根据此处的说明:http: //msdn.microsoft.com/en-us/library/ff664686 (v=pandp.50).aspx 我正在尝试将 CryptographyManager 注入 MyService。

我的引导代码如下所示:

        var builder = new ContainerBuilder();
        builder.RegisterEnterpriseLibrary();
        builder.RegisterType<MyService>().As<IMyService>();
        _container = builder.Build();

        var autofacLocator = new AutofacServiceLocator(_container);
        EnterpriseLibraryContainer.Current = autofacLocator;

App.config 为 symmetricCryptoProviders 定义了以下信息:

name: RijndaelManaged
type: Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.HashAlgorithmProvider, Microsoft.Practices.EnterpriseLibrary.Security.Cryptography, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
algorithmType:System.Security.Cryptography.RijndaelManaged
protectedKeyFilename:[path_to_my_key]
protectedKeyProtectionScope: LocalMachine

有谁有这种技术组合的经验?

经过一些测试,我相信我可能会使用 Unity 容器,因为我对 IOC 容器没有偏好,除了我使用的任何东西都应该与 ASP.NET MVC3 和 http 托管的 WCF 服务很好地集成。

然后我的引导代码变得更加简单:

var container = new UnityContainer() .AddNewExtension<EnterpriseLibraryCoreExtension>(); container.RegisterType<IMyService, MyService>();

4

1 回答 1

1

我实际上编写了 Autofac EntLib 配置器(在一些 P&P 人员的帮助下)。它已经使用异常处理块和日志记录块进行了测试,但我还没有尝试使用密码学的东西。

EntLib 有一个有趣的事情,它有时需要命名已注册的服务,我从它所说的异常中猜测......

type ISymmetricCryptoProvider, key "RijndaelManaged"

...我在想 EntLib 希望您注册一个命名服务,例如:

builder.Register(c =>
                 {
                   // create the HashAlgorithmProvider using
                   // RijndaelManaged algorithm
                 })
        .Named<ISymmetricCryptoProvider>("RijndaelManaged");

我有点猜测确切的注册,因为我再一次没有经验或测试它,但想法是 EntLib 正在尝试注册命名服务,而实际服务没有注册名字

RegisterEnterpriseLibrary扩展基本上通过并尝试使用 Unity 用于进行命名/未命名注册的相同算法。我猜你遇到了一个边缘情况,有些事情没有得到正确处理。EntLib 与 Unity 紧密相关,即使他们确实尝试将其抽象掉。

如果您不依赖 Autofac,Unity 将是您前进的阻力最小的道路。我喜欢 Autofac 的易用性和更轻量级的特性,我的应用程序都与它相关联,所以我需要一切都以这种方式工作;如果您没有这样的亲和力,使用 Unity 可能会更容易。

抱歉,这不是一个超级答案。IoC 中的 EntLib 连接是一个非常复杂的野兽。

于 2012-03-09T18:56:19.550 回答