当站点部署在 Azure 上时,AntiForgeryToken 在 F5 刷新时在 IE 中创建问题

AntiForgeryToken creating issue in IE on F5 refresh while the site is deployed on Azure

在我的 ASP.NET MVC 应用程序中考虑以下场景:

查看:

@using (Html.BeginForm())
{
    @Html.ValidationSummary(false)
    @Html.AntiForgeryToken()

    @Html.LabelFor(m => m.FirstName)
    <br />
    @Html.EditorFor(m => m.FirstName)
    <br />
    @Html.LabelFor(m => m.LastName)
    <br />
    @Html.EditorFor(m => m.LastName)

    <br />
    <p>
        <input type="submit" title="Save" />
    </p>
}

获取操作:

[HttpGet]
public ActionResult Contact()
{
    return View();
}

Post 操作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Contact(Contact contact)
{
    ModelState.AddModelError("Test Exception", new Exception("An exception thrown by Submit button"));

    if (!ModelState.IsValid)        
         return View(contact);       

    return RedirectToAction("Manage");
}

现在,当我在没有提供名字的情况下第一次按下提交按钮时,它正确地显示了验证错误。但是,当我按 F5 刷新页面时,它首先要求确认重新发送信息(这在 IE 中是预期的),但是一旦我说重试,它就会抛出一个错误,说视图中没有提供 AntiFrogery 密钥。

这只发生在 IE 中,并且只有当我尝试使用部署在 Azure 盒子中的站点时才会发生。

请注意,这在我的开发环境中使用 Debug 和 Release 配置文件以及在 IIS 上部署后都非常有效。

知道为什么会这样吗?

这很可能发生,因为您在多个实例上 运行,并且没有在 web.config 的 <system.web> 部分中指定 <machineKey><machineKey>。验证 cookie 和令牌使用唯一的 "machine key" 编码和解码。这意味着如果您有一个服务器场(多个实例),或者更改您的服务器,您的 cookie 将不再有效。 <machineKey> 元素看起来像:

<machineKey validationKey="DBB803BD7C3F11863BBA0AA7BCE555CB632587EEADE0A357830A1B792B0AE6203E11F5BF226427548CA0270BC913906CFCE526418258BA63BB772EB3103D7564" decryptionKey="2B92D5991197A746E221902F6D1588F194DC58CCD0AE78FC77B923825DFDFC6A" validation="SHA1" decryption="AES" />

您可以在此处生成唯一的 - Generate ASP.NET Machine Keys