当站点部署在 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。
在我的 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。