【问题标题】:Utilizing RijndaelManaged, Enterprise Library and Autofac together一起使用 RijndaelManaged、Enterprise Library 和 Autofac
【发布时间】:2012-03-08 23:12:18
【问题描述】:

我正在使用 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>();

【问题讨论】:

    标签: enterprise-library autofac rijndaelmanaged


    【解决方案1】:

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

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

    type ISymmetricCryptoProvider, key "RijndaelManaged"
    

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

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

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

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

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

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

    【讨论】:

    • 感谢您的反馈。今后我会牢记这一点。由于我已经切换到 Unity,而且它似乎非常适合我的需求,所以我没有花任何时间测试你的理论。从技术上讲,您的答案是一个答案,因此我将其标记为这样。
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多