使用不同Web应用程序之间的FormsAuthentication“无法验证数据”

时间:2012-07-05 22:16:49

标签: forms-authentication asp.net-mvc-4 machinekey

我在同一台服务器上运行了两个.NET Web应用程序 - sentinel (托管在https://sentinel.mydomain.com/)和 fortknox (在http://www.mydomain.com/fortknox

Sentinel是一个身份验证“门户”。 FortKnox是一个“概念证明”应用程序,它使用表单身份验证,但loginUrl设置为https://sentinel.mydomain.com/login(以及一个特殊的Application_EndRequest处理程序来限定ReturnUrl)。 Sentinel是使用MVC 4和Razor在.NET 4.0中编写的; FortKnox是使用.NET 2.0的ASP.NET MVC 2。

我正在使用ASP.NET FormsAuthentication,并将Cookie域设置为.mydomain.com,以便sentinel.mydomain.com设置的Cookie将与www.mydomain.com的请求一起发送,反之亦然。 Cookie部分工作正常 - 两个应用程序都获得了相同的.ASPXAUTH加密表单。

问题是,在我们的生产服务器上, fortknox 无法解密由 sentinel 创建的Cookie - 即使他们有相同的机器密钥。即使两个应用程序都在同一个物理盒上运行,它也不起作用。

用户点击fortknox,他们被重定向到哨兵,他们登录,cookie被设置,他们被重定向回fortknox,然后我得到“无法验证数据”:

Exception: Unable to validate data.
  at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo, Boolean signData)
  at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo)
  at System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket)
  at FortKnox.Web.MvcApplication.Application_BeginRequest() 

机器密钥是相同的 - 我已经在每页的标记中包含了这些(讨厌的!)代码:

try {
    var cookie = Request.Cookies[".ASPXAUTH"].Value;
    Response.Write("Cookie: " + cookie + Environment.NewLine);
    var ticket = FormsAuthentication.Decrypt(cookie);
    Response.Write("Ticket name: " + ticket.Name + Environment.NewLine);
} catch (Exception x) {
    Response.Write("Exception: " + x.Message + Environment.NewLine);
    Response.Write(x.StackTrace);
}
Response.Write("<hr /></pre>");
var machineConfigMachineKey = (MachineKeySection)WebConfigurationManager.OpenMachineConfiguration().SectionGroups["system.web"].Sections["machineKey"];
var webConfigMachineKey = (MachineKeySection)WebConfigurationManager.OpenWebConfiguration("").SectionGroups["system.web"].Sections["machineKey"];
Response.Write("<pre>");
Response.Write("<b>machine.config decrypt:  </b>" + machineConfigMachineKey.DecryptionKey + "<br />");
Response.Write("<b>web.config decrypt:      </b>" + webConfigMachineKey.DecryptionKey + "<br />");
Response.Write("<br />");
Response.Write("<b>machine.config validate: </b>" + machineConfigMachineKey.ValidationKey + "<br />");
Response.Write("<b>web.config validate:     </b>" + webConfigMachineKey.ValidationKey + "<br />");
Response.Write("</pre>");
Response.Write("<hr />");

并验证在运行时使用的机器密钥完全相同。

特别令人沮丧的是,它一直致力于我们的开发和登台服务器,并且只在生产中失败了。服务器之间的唯一区别是生产盒经常安装Windows更新,而我们的开发/暂存盒可能缺少一些更新;它们在其他方面是相同的(从相同的图像克隆并使用相同的设置脚本创建)

所以......同样的服务器;同一台机器钥匙。 ASP.NET 4设置了FormsAuthentication cookie。 ASP.NET 2应用程序无法解密它。只在某些服务器上发生错误;在其他人身上,它正在发挥作用。在这一点上,我完全陷入困境......任何想法?

编辑:直播服务器已达到最新补丁级别。我试过申请

<add key="aspnet:UseLegacyEncryption" value="true" />
对于登录应用程序和fortknox应用程序,

同时为true和false。仍然没有运气......

2 个答案:

答案 0 :(得分:1)

它有可能与旧的2010填充oracle安全补丁 - http://weblogs.asp.net/scottgu/archive/2010/09/28/asp-net-security-update-now-available.aspx有关吗?尝试设置

<add key="aspnet:UseLegacyEncryption" value="true" />

强制修补的服务器像补丁之前那样行事吗?

(或者,你知道......修补你的服务器。你的选择。)

答案 1 :(得分:1)

您是否尝试过以下所有按键? http://support.microsoft.com/kb/2425938

<add key="aspnet:UseLegacyEncryption" value="true" />
<add key="aspnet:UseLegacyMachineKeyEncryption" value="true" />
<add key="aspnet:ScriptResourceAllowNonJsFiles" value="true" />