配置 antiforgerytoken 单次使用 mvc asp.net

Posted

技术标签:

【中文标题】配置 antiforgerytoken 单次使用 mvc asp.net【英文标题】:configure antiforgerytoken single use mvc asp.net 【发布时间】:2015-12-13 17:02:33 【问题描述】:

我想为每个请求修改 AntiForgeryToken。

我读了这些帖子:

Is it possible to make the AntiForgeryToken value in ASP.NET MVC change after each verification? ASP.NET MVC Anti Forgery Token Insecure

最初的帖子明确排除了它,但后者似乎提到它“非常简单”。但是我不太明白如何实现令牌的一次性使用。

在我当前的实现中,我将令牌作为安全的 http-only cookie 交付。但它在整个会话中保持不变。我不在乎我的实现是否会破坏后退按钮。有什么建议吗?

【问题讨论】:

【参考方案1】:

由于我们没有您的示例,因此不确定您是如何使用它的,但是像这样的简单表单确实会在表单中的每个请求上显示一个新令牌

@using (html.BeginForm()) 
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)<fieldset>
    <legend>Person</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Address)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Address)
        @Html.ValidationMessageFor(model => model.Address)
    </div>

    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset> 

上面的表格向我展示了每个请求中的不同值,例如

<input name="__RequestVerificationToken" type="hidden" value="53WW641jzT5QWcIrrLltqF0OGt79US1eBwue1MQU6lW200CxUiD6fcC949RZee4gcNrFNnaP5QYFi6lJd_QmuUqSfex7wWHwWjUC30_kVrI1" />

&lt;input name="__RequestVerificationToken" type="hidden" value="QXHlA8N9g_95YbPeEpjPHhjQFV9IMNJf7eEdnPnADH9BPgQg_DQQKQqf9diPAxMQWJoBcT6FeXCIECe-Qd6Q6wA5BimVlU9K0C67nokzuXQ1" /&gt;

有更多关于SO here的信息,还参考了其他详细信息outside here

【讨论】:

谢谢,但不是我专门问的。我知道在调用“@Html.AntiForgeryToken()”的地方会生成一个新令牌。但是我想知道的是,在服务器端,我如何拒绝包含以前使用过的验证令牌的请求。 在当前的实现中,没有什么可以阻止客户端使用相同的防伪令牌多次提交相同的表单。它可重复使用。即使每次页面加载都会生成一个新的。 (或者即使在同一页面上多次调用@Html.AntiForgeryToken()

以上是关于配置 antiforgerytoken 单次使用 mvc asp.net的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ajax 中使用 AntiForgeryToken

使用删除链接删除对象时如何包含 @Html.AntiForgeryToken()

何时不需要/需要使用 AntiForgeryToken?

使用 $.ajax 发布 JSON 数据时如何提供 AntiForgeryToken?

使用 jQuery Ajax 和 Html.AntiForgeryToken() 时,防伪表单字段“__RequestVerificationToken”不存在

ASP.Net MVC 的 AntiForgeryToken 方法是不是适用于负载均衡器?