API защиты данных ASP.Net Core в кластерной среде

Мне сложно понять API защиты данных.

Я хочу настроить некоторые веб-приложения net core в кластерной среде (служебная ткань). Раньше вам нужно было просто убедиться, что у каждой машины один и тот же ключ в файле web.config. Простой. С новым API защиты данных это кажется немного более сложным (много!).

Из документации здесь кажется, что это должно быть так же просто, как настроить службу защиты данных с соответствующим сертификатом.

Однако я пробовал это:

    public static void Main(string[] args)
    {
        // add data protection services
        var serviceCollection = new ServiceCollection();
        string thumbPrint = "XXXXXXXXXXXX";
        serviceCollection.AddDataProtection()
            .ProtectKeysWithDpapiNG($"CERTIFICATE=HashId:{thumbPrint}", flags: Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiNGProtectionDescriptorFlags.None);
        var services = serviceCollection.BuildServiceProvider();

        // create an instance of MyClass using the service provider
        var instance = ActivatorUtilities.CreateInstance<MyClass>(services);
        instance.RunSample();
    }

    public class MyClass
    {
        IDataProtector _protector;

        // the 'provider' parameter is provided by DI
        public MyClass(IDataProtectionProvider provider)
        {
            _protector = provider.CreateProtector("Contoso.MyClass.v1");
        }

        public void RunSample()
        {
            Console.Write("Enter input: ");
            string input = Console.ReadLine();

            // protect the payload
            string protectedPayload = _protector.Protect(input);
            Console.WriteLine($"Protect returned: {protectedPayload}");

            // unprotect the payload
            string unprotectedPayload = _protector.Unprotect(protectedPayload);
            Console.WriteLine($"Unprotect returned: {unprotectedPayload}");

            Console.ReadLine();
        }
    }

И я просто получаю исключение

System.InvalidOperationException occurred
  HResult=0x80131509
  Message=No service for type 'Microsoft.AspNetCore.DataProtection.Repositories.IXmlRepository' has been registered.

После некоторых поисков выясняется, что это связано с тем, что для ключей не указано постоянное хранилище.

Что здесь советуют? Должен ли я сохранять свои ключи в каком-то центральном месте (то есть в общей папке, доступной для всех моих приложений). Если да, то в чем причина?


person Mardoxx    schedule 12.04.2017    source источник
comment
вам нужно четко указать, где хранятся ключи. docs.microsoft.com/en-gb/ aspnet / core / security / data-protection / - попробуйте, например, .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));.   -  person Christo    schedule 25.07.2017
comment
@Christo Спасибо! Полностью подумав, что я обновил этот вопрос, в итоге я сохранил свои ключи в AzureStorage.   -  person Mardoxx    schedule 25.07.2017


Ответы (1)


Вы должны предоставить реализацию IXmlRepository, которая предоставляет API защиты данных место для хранения ключей. Директивы ProtectKeysWith*() защищают ключи в состоянии покоя (в общем, шифруют ключи перед их сохранением!). Дополнительная информация здесь.

В итоге я сохранил свои ключи в AzureStorage. Дополнительная информация здесь.

serviceCollection.AddDataProtection()
    .ProtectKeysWithDpapiNG($"CERTIFICATE=HashId:{thumbPrint}", flags: Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiNGProtectionDescriptorFlags.None)
    .PersistKeysToAzureBlobStorage(/* params */);

Также стоит отметить, что сертификат, используемый для защиты ключей, должен храниться в хранилище сертификатов, а учетная запись, под которой работает приложение, должна иметь доступ для чтения. См. здесь.

person Mardoxx    schedule 25.07.2017
comment
Как это работает, если теперь каждое приложение в кластере будет пытаться свернуть все ключи в одно и то же время? - person Moismyname; 18.06.2019