Альтернатива ключа машины .Net Core для webfarm

Я использую dotnet core для создания приложения, которое работает в кластере Kubernetes на хостах Linux. Когда я тестировал, он заметил получение исключений при проверке токенов CSRF, что имеет смысл, так как я еще не редактировал ключ машины, чтобы быть одинаковым на каждом экземпляре. Когда я приступил к установке ключа машины в web.config я заметил, что это больше не будет работать в .Net Core.

как сейчас с помощью API DataProtection, ключ машины больше не работал. Я попытался реализация api в моем приложении, но когда я читаю, мне нужно будет использовать сетевой ресурс для обмена ключами между всеми экземплярами, я был ошеломлен. Наверняка есть более простой (и лучший) способ сделать это без того, чтобы полагаться на долю, чтобы быть онлайн?

Я попытался установить следующее в классе запуска в методе ConfigureServices:

services.AddDataProtection().SetApplicationName("DockerTestApplication");

Я как-то ожидал, что ключи будут созданы с помощью applicationname, но это не решить проблему.

Я нашел некоторые интересные документы, которые все используют код, который больше не будет компилироваться, я думаю, Microsoft изменила некоторые вещи:

https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/replacing-machinekey

кто-нибудь знает решение этой проблемы, которое также будет работать в Linux и имеет возможность делиться токенами по сети между экземплярами?

спасибо вперед!

1 ответов


Я сделал несколько тестов для резервного копирования моего комментария о копировании ключей. Сначала я создал простое консольное приложение со следующим кодом:

var serviceCollection = new ServiceCollection();
serviceCollection.AddDataProtection()
    .SetApplicationName("my-app")
    .PersistKeysToFileSystem(new DirectoryInfo(@"G:\tmp\so\keys"));
var services = serviceCollection.BuildServiceProvider();
var provider = services.GetService<IDataProtectionProvider>();
var protector = provider.CreateProtector("some_purpose");                
Console.WriteLine(Convert.ToBase64String(protector.Protect(Encoding.UTF8.GetBytes("hello world"))));

Итак, просто создайте контейнер DI, зарегистрируйте защиту данных там с определенной папкой для ключей, разрешите и защитите что-то.

это создало следующий ключевой файл в целевой папке:

<?xml version="1.0" encoding="utf-8"?>
<key id="e6cbce11-9afd-43e6-94be-3f6057cb8a87" version="1">
  <creationDate>2017-04-10T15:28:18.0565235Z</creationDate>
  <activationDate>2017-04-10T15:28:18.0144946Z</activationDate>
  <expirationDate>2017-07-09T15:28:18.0144946Z</expirationDate>
  <descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
    <descriptor>
      <encryption algorithm="AES_256_CBC" />
      <validation algorithm="HMACSHA256" />
      <masterKey p4:requiresEncryption="true" xmlns:p4="http://schemas.asp.net/2015/03/dataProtection">
        <!-- Warning: the key below is in an unencrypted form. -->
        <value>rVDib1M1BjbCqGctcP+N25zb+Xli9VWX46Y7+9tsoGywGnIg4p9K5QTM+c388i0mC0JBSLaFS2pZBRdR49hsLQ==</value>
      </masterKey>
    </descriptor>
  </descriptor>
</key>

как вы видите, файл относительно прост. В нем говорится о создании, активации, сроках годности, используемых алгоритмах, ссылка на класс deserializer и, конечно же, сам ключ.

теперь я настроил asp.net приложение (Итак, другое приложение, а не консольное), например:

services.AddDataProtection()
    .SetApplicationName("my-app")
    .PersistKeysToFileSystem(new DirectoryInfo(@"G:\tmp\so\keys-asp"))
    .DisableAutomaticKeyGeneration();

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

так Обратите внимание на обычное проблемы безопасности с копированием ключей, до истечения срока действия этих ключей (настраивается с помощью SetDefaultKeyLifetime) и используя ту же версию Microsoft.AspNetCore.DataProtection во всех приложениях, с которыми Вы делитесь ключами (потому что его версия указана в файле Key xml) - и вы должны быть в порядке. Лучше генерировать ваши ключи в одном месте и во всех других местах набор DisableAutomaticKeyGeneration.