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

时间:2016-01-07 13:00:26

标签: .net asp.net-mvc azure asp.net-mvc-5 antiforgerytoken

在我的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上部署后都可以正常工作。

知道为什么会这样吗?

1 个答案:

答案 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