【问题标题】:Is Child Action Output Cache incompatible with FIPS?子操作输出缓存是否与 FIPS 不兼容?
【发布时间】:2014-09-16 21:36:57
【问题描述】:

我正在尝试使我的 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 目标、Object[] 参数、签名 sig、布尔构造函数)+0
System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化) +339 System.Security.Cryptography.CryptoConfig.CreateFromName(字符串名称, 对象[] args) +656 System.Security.Cryptography.SHA256.Create() +14 System.Web.Mvc.OutputCacheAttribute.GetChildActionUniqueId(ActionExecutingContext filterContext) +315
System.Web.Mvc.OutputCacheAttribute.OnActionExecuting(ActionExecutingContext filterContext) +118

正如您在此处看到的,异常本身发生在 OutputCacheAttribute.GetChildActionUniqueId 的 MVC 内部深处 - 显然它正在尝试使用非 FIPS 批准的 SHA256 哈希,我看不到一种方法来指示它使用不同的哈希。

所以首先要尝试解决它是在配置元素下的 web.config 文件中包含以下内容:

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

但是,我之前和之前一样多的人意识到,此设置对 Web 应用程序(无论是托管在 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。

有什么我可能遗漏的吗?有什么方法可以从所有输出缓存子操作实例中剥离应用程序?

【问题讨论】:

    标签: asp.net-mvc-4 .net-4.5 outputcache fips


    【解决方案1】:

    这与http://forums.asp.net/p/1979986/5672126.aspx?Can+t+use+SignalR+on+Win+Server+2008+with+FIPS+mode+on 的问题相同。 CLR 团队已经意识到这一点,并正在考虑修复。

    与此同时,您可以使用与上述错误报告中相同的解决方法。将以下内容添加到 Global.asax 中的 Application_Start:

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

    【讨论】:

    • 太棒了!那行得通 - 谢谢 - 我什至可能在某个地方看到过 SignalR 问题,但我认为它不相关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2016-09-03
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多