Совместное использование RijndaelManaged, Enterprise Library и Autofac - PullRequest
0 голосов
/ 09 марта 2012

Я заново экспериментирую с блоком приложения криптографии, используя Autofac в качестве контейнера.

В результате я использую пакет nuget EntLibContrib 5.0 - Autofac Configurator .

С провайдером симметричного шифрования DPAPI я смог прекрасно зашифровать / расшифровать данные.

Однако с помощью 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 эта информация определена для симметричногоCryptoProviders:

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>();

1 Ответ

1 голос
/ 09 марта 2012

Я на самом деле написал конфигуратор 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.

Извините, это не супер ответ. EntLib в IoC - действительно сложный зверь.

...