【发布时间】: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