子操作输出缓存是否与FIPS不兼容?

时间:2014-09-16 21:36:58

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

我正在努力使我的ASP.NET MVC 4应用程序与FIPS兼容。幸运的是,使用.NET 4.5 ASP.NET已经使用FIPS认可的AES实现视图状态和cookie加密,因此没有问题。

但是我遇到了一个奇怪的问题。这可以使用非常简约的ASP.NET MVC App进行复制。

创建简单的控制器:

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   target,Object []参数,签名sig,布尔构造函数)+0
  System.Reflection.RuntimeConstructorInfo.Invoke(的BindingFlags   invokeAttr,Binder binder,Object []参数,CultureInfo文化)   +339 System.Security.Cryptography.CryptoConfig.CreateFromName(String name,   Object [] 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中),即使它对同一台机器上的控制台应用程序完全正常。

切换到三重des的常见ASP.NET 2.0解决方案也没有任何影响

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

毕竟在.NET 4.5中,我们已经将FIPS认可的AES用于这些目的。

在整台计算机上禁用FIPS(通过注册表或组策略工具)可以很好地完成,但当然目标是让它在机器级别启用FIPS。

我可能会遗漏一些东西吗?有没有办法让它从输出缓存子操作的所有实例中剥离应用程序?

1 个答案:

答案 0 :(得分:4)

这与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");