Я пытаюсь сделать мое приложение 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 на уровне машины.
Есть ли что-то, что я могу упустить? Есть ли способ заставить его работать, удалив приложение из всех экземпляров выходных кэшированных дочерних действий?