2014-09-16 5 views
2

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

Однако я столкнулся с странной проблемой. Это можно воспроизвести с помощью очень минималистического приложения 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 Platform FIPS проверенного криптографических алгоритмов]
System.Security .Cryptography.SHA256Managed..ctor() +10840001

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

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

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

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

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

Общее решения ASP.NET 2.0 переключения на тройную DES, не имеет никакого эффекта либо

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

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

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

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

ответ

4

Это же проблема, что и http://forums.asp.net/p/1979986/5672126.aspx?Can+t+use+SignalR+on+Win+Server+2008+with+FIPS+mode+on. Команда CLR знает об этом и рассматривает исправление.

В то же время вы можете использовать тот же обходной путь, что и в отчете об ошибке выше. Добавьте в приложение Application_Start в Global.asax следующее:

CryptoConfig.AddAlgorithm(typeof(SHA256Cng), "System.Security.Cryptography.SHA256"); 
+0

Фантастический! Это сработало - Спасибо, я, возможно, даже где-то видел, что проблема SignalR где-то, но я отклонил его как не связанный –