Кэш вывода дочерних действий несовместим с FIPS?

Я пытаюсь сделать мое приложение ASP.NET MVC 4 совместимым с FIPS. К счастью, в .NET 4.5 ASP.NET уже использует одобренную FIPS реализацию AES для шифрования состояния просмотра и файлов cookie, поэтому с этим проблем нет.

Однако я столкнулся со странной проблемой. Это можно воспроизвести с помощью очень минималистического приложения ASP.NET MVC.

Создайте простой контроллер:

public class HomeController : Controller
{

    public ActionResult Index()
    {
        return View();
    }

    [OutputCache(Duration =  5)]
    public ActionResult Data()
    {
        return View();
    }

}

Создайте очень простые представления для индекса:

<h2>Page</h2>
@Html.Action("Data")

и действия с данными:

<h2>Data</h2>

Таким образом, в основном мы пытаемся использовать кэширование вывода для дочернего действия (работает как шарм без включенного FIPS).

Теперь, если мы запустим его, мы получим наш ужасный экран смерти FIPS:

[InvalidOperationException: эта реализация не является частью проверенных криптографических алгоритмов платформы Windows FIPS.]
System.Security.Cryptography.SHA256Managed..ctor() +10840001

[TargetInvocationException: целью вызова было создано исключение.] System.RuntimeMethodHandle.InvokeMethod(Цель объекта, аргументы Object[], знак подписи, логический конструктор) +0
System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr , связующее связующее, параметры Object[], культураInfo) +339 System.Security.Cryptography.CryptoConfig.CreateFromName(имя строки, аргументы Object[]) +656 System.Security.Cryptography.SHA256.Create() +14 System.Web .Mvc.OutputCacheAttribute.GetChildActionUniqueId(ActionExecutingContext filterContext) +315
System.Web.Mvc.OutputCacheAttribute.OnActionExecuting(ActionExecutingContext filterContext) +118

И, как вы можете видеть здесь, само исключение происходит глубоко в недрах MVC в OutputCacheAttribute.GetChildActionUniqueId - очевидно, оно пытается использовать хэшер SHA256, не одобренный FIPS, и я не вижу способа указать ему использовать другой.

Итак, первое, что приходит на ум, чтобы попытаться решить эту проблему, это включить в файл web.config в элементе конфигурации следующее:

<runtime>
  <enforceFIPSPolicy enabled="false"/>
</runtime>

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

Обычное решение ASP.NET 2.0 для переключения на тройной код также не имеет никакого эффекта.

<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES" decryption="3DES"/>

В конце концов, в .NET 4.5 для этих целей уже используется AES, одобренный FIPS.

Отключение FIPS на всей машине (через реестр или инструмент групповой политики) прекрасно работает, но, конечно, цель состоит в том, чтобы он работал с включенным FIPS на уровне машины.

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


person Sebastian K    schedule 16.09.2014    source источник


Ответы (1)