Мы используем 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 не защищен только одной машиной, которая его создала. Пожалуйста, помогите, я не знаю, какая именно ошибка.