Брелок для защиты данных с S3 не работает должным образом в ядре dot net - PullRequest
1 голос
/ 25 января 2020

Мы используем MVC с версией tnet core 2.2.0. Для защиты данных мы используем AWS S3 в качестве постоянного хранилища. Веб-приложение размещается как сервис windows на двух машинах за балансировщиком нагрузки. Аутентификация основана на куки. На обеих машинах ниже приведена конфигурация для хранилища ключей на S3.

    "AwsProfile": true,
    "Location": "s3-bucket-name",
    "UseS3Protection": true,
    "KeyPrefix": "keys/", 
    "CanMachineGenerateKeyRing" : true

CanMachineGenerateKeyRing имеет значение true на обеих машинах. Пример кода для добавления защиты данных приведен ниже:

       services.AddDataProtection().SetApplicationName("app") 
      .SetDefaultKeyLifetime(TimeSpan.FromDays(10))
      .PersistKeysToAwsS3(CreateAmazonS3Client(configuration), 
      .new S3XmlRepositoryConfig(configuration["Location"]) 
      { 
         KeyPrefix = configuration["KeyPrefix"] 
      })
     .ProtectKeysWithCertificate(certificate1)
     .UnprotectKeysWithAnyCertificate(certificate1);

После добавления слоя защиты данных мы добавили слой проверки подлинности файлов cookie, как показано ниже:

       services.AddAuthentication(options =>
        {
            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
       .AddCookie(options =>
       {
           options.Cookie.Name = "cookie1";
           options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
           options.DataProtectionProvider = DataProtectionProvider.Create("app");
           options.DataProtectionProvider.CreateProtector("app");
           options.Cookie.Path = "/";
           options.Cookie.IsEssential = true;
           options.Cookie.Expiration = TimeSpan.FromMinutes(60);
           options.ExpireTimeSpan =
                       TimeSpan.FromMinutes(60);
           options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
           options.LoginPath = "/login";               
           options.Validate();
       });

Теперь проблема заключается в следующем: после аутентификация пользователя успешно, аутентификация cook ie приземлилась в браузере. Всякий раз, когда я запрашиваю у сервера защищенный ресурс, некоторые запросы обрабатываются успешно, а некоторые из них получают сбой со статусом 403. Когда я вижу журналы, он говорит

Уровень ":" Информация "," MessageTemplate ":" {AuthenticationScheme} не был аутентифицирован. Сообщение об ошибке: {FailureMessage} ",« Properties »: {« AuthenticationScheme »:« Cookies »,« FailureMessage »:« Снять незащищенный билет »,« EventId »: {« Id »: 7},« SourceContext »:« Microsoft. AspNetCore.Authentication.Cookies.CookieAuthenticationHandler

{"Timestamp": "2020-01-24T20: 14: 10.6128310 + 00: 00", "Level": "Warning", "MessageTemplate": "Ошибка снятия защиты Повар сеанса ie. "," Исключение ":" System.Security.Cryptography.CryptographicException: ключ {d21e65c4-b7f0-41dd-903b-ab11f4a788d0} не найден в кольце для ключей. \ r \ n в Microsoft.AspNetCore .DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore (байт [] protectedData, булева allowOperationsOnRevokedKeys, UnprotectStatus и статус) \ г \ п на Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect (байт [] protectedData, Boolean, Boolean ignoreRevocationErrors & requiresMigration, Boolean & wasRevoked ) \ r \ n в Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect (B yte [] protectedData)

Одно странное поведение заключается в том, что cook ie не защищен только одной машиной, которая его создала. Пожалуйста, помогите, я не знаю, какая именно ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...