Сбой TempData в веб-ферме - PullRequest
       7

Сбой TempData в веб-ферме

0 голосов
/ 29 января 2019

При развертывании в веб-ферме (в основном 2 блока Windows Server 2016) приведенный ниже код не может прочитать данные из TempData.Последовательность событий следующая: страница UserInfo помещается в POST, TempData устанавливается, а затем перенаправляется в GET UserInfo.В GET TempData не может быть прочитано.

[HttpPost]
public IActionResult UserInfo(Model model) {
    TempData["Model"] = JsonConvert.SerializeObject(model);
    return RedirectToAction("UserInfo");            
}

[HttpGet]
public IActionResult UserInfo() {
    string serialized = (string)TempData["Model"];
    if (serialized != null) {
        var model = JsonConvert.DeserializeObject<Model>(serialized);
        return View(model);
    } else {
        // nothing here redirect home
        return RedirectToAction("Landing");
    }
}

Я получаю следующую ошибку в журнале std (но не вызывает исключения в моем коде):

warn: Microsoft.AspNetCore.Mvc.ViewFeatures.CookieTempDataProvider[3]
      The temp data cookie .AspNetCore.Mvc.CookieTempDataProvider could not be loaded.

System.Security.Cryptography.CryptographicException: The key {0dd9c024-af79-407b-9820-db7f094975f9} was not found in the key ring.
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.CookieTempDataProvider.LoadTempData(HttpContext context)

PS Следует отметить, что этот код работает в инстансах IIS, не относящихся к веб-ферме, и на виртуальном хостинге Asure.

1 Ответ

0 голосов
/ 30 января 2019

Исключение говорит вам все, что вам нужно знать.Была предпринята попытка прочитать файл cookie, но расшифровка не удалась, в частности из-за того, что ключ не найден в кольце ключей защиты данных.Это означает, что вы не разделяете защиту данных между каждым экземпляром в ферме.Несмотря на то, что это одно и то же приложение, каждый экземпляр фактически является собственной сущностью.Таким образом, вы должны рассматривать его как любой другой сценарий, когда защита данных должна быть разделена между сайтами, а именно: использовать общее хранилище ключей и гарантировать, что используется одно и то же имя приложения:

services.AddDatProtection()
    .SetApplicationName("Shared Name")
    .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));

Счто каждый экземпляр сможет считывать файлы cookie, установленные другими экземплярами, что затем заставит TempData работать между экземплярами.

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