在我的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();
}
发布行动:
[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键。 / p>
这仅在IE中发生,并且仅在我尝试使用Azure框中部署的站点时才会发生。
请注意,这在我的开发环境中使用Debug和Release配置文件以及在IIS上部署后都可以正常工作。
知道为什么会这样吗?
答案 0 :(得分:0)
这很有可能发生,因为您在多个实例上运行,并且未在您的web.config的<machineKey>
部分中指定<system.web>
。 <machineKey>
。<machineKey>
。验证cookie和令牌使用唯一的&#34;机器密钥进行编码和解码&#34;。这意味着,如果您有服务器场(多个实例)或更改服务器,则您的cookie将不再有效。 <machineKey validationKey="DBB803BD7C3F11863BBA0AA7BCE555CB632587EEADE0A357830A1B792B0AE6203E11F5BF226427548CA0270BC913906CFCE526418258BA63BB772EB3103D7564" decryptionKey="2B92D5991197A746E221902F6D1588F194DC58CCD0AE78FC77B923825DFDFC6A" validation="SHA1" decryption="AES" />
元素如下所示:
def someService
你可以在这里生成一个独特的 - Generate ASP.NET Machine Keys。