我有一个表格帖子,一直给我一个反伪造令牌错误.
这是我的表格:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.EditorFor(m => m.Email)
@Html.EditorFor(m => m.Birthday)
<p>
<input type="submit" id="Go" value="Go" />
</p>
}
Run Code Online (Sandbox Code Playgroud)
这是我的行动方法:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Join(JoinViewModel model)
{
//a bunch of stuff here but it doesn't matter because it's not making it here
}
Run Code Online (Sandbox Code Playgroud)
这是web.config中的machineKey:
<system.web>
<machineKey validationKey="mykey" decryptionKey="myotherkey" validation="SHA1" decryption="AES" />
</system.web>
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
A required anti-forgery token was not supplied or was invalid.
Run Code Online (Sandbox Code Playgroud)
我已经读过,更改HttpContext上的用户会使令牌无效,但这不会发生在这里.我的Join操作上的HttpGet只返回视图:
[HttpGet]
public ActionResult Join()
{
return this.View();
}
Run Code Online (Sandbox Code Playgroud)
所以我不确定发生了什么.我一直在搜索,似乎所有东西都表明它是机器键更改(应用程序周期)或用户/会话更改.
还有什么可以继续?我该如何解决这个问题?
我有反CRSF MVC机制的问题.cookie和返回的表单输入不匹配.我每次都会收到一个错误,只在一个特定的页面中.在应用程序的其余部分,它运行良好.
服务器正在返回HTTP 500 Internal Server Error,我可以在日志中看到此异常:
[System.Web.Mvc.HttpAntiForgeryException]:{"未提供所需的防伪标记或无效."}
这是服务器生成的隐藏输入:
<input name="__RequestVerificationToken" type="hidden" value="QK8P7rjyZE6Vm5seY7Fr704YCOoFGdTIMzl1W7R0ZFpXSMjGKLG2T05DfFSYTxvtQCEx7DDT69DGsDB2+ZXFHY8oAjiKz0gw8BhDFywgmfIpoXnGpj7fONNzIIfvbrDrE9WJsMu6Io/0bDLM5WfKs0zktiNjyOWpfYrmnfINYmjW8NLOZFoz74xTcgTptAld">
Run Code Online (Sandbox Code Playgroud)
这是Cookie返回:
Set-Cookie:__RequestVerificationToken_L2VGbG93=skmTAVI8HCbfxDS+xhioIMIISL3UOBI7qJM1JbHjTtAqKl4W70pDUcTKMm0p3R3mrHDziE8vXw0C0OO4HArzWO1/e6py+v/cFdbe9maFgjl4jMiZ9Wc4YIhC6+IUXkk6yqJDJ8dCIr8qtGaYcD9IX+m7/SlVhu521KQSWJYRcaY=; path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)
当我检查服务器发送的内容时,cookie完全相同,但我认为有效负载具有不同的编码:
__RequestVerificationToken:QK8P7rjyZE6Vm5seY7Fr704YCOoFGdTIMzl1W7R0ZFpXSMjGKLG2T05DfFSYTxvtQCEx7DDT69DGsDB2%2BZXFHY8oAjiKz0gw8BhDFywgmfIpoXnGpj7fONNzIIfvbrDrE9WJsMu6Io%2F0bDLM5WfKs0zktiNjyOWpfYrmnfINYmjW8NLOZFoz74xTcgTptAld
Run Code Online (Sandbox Code Playgroud)
区别在于两个出现编码的字符:
/ -> %2F
+ -> %2B
Run Code Online (Sandbox Code Playgroud)
这些是我在隐藏输入字段和后有效负载之间可以找到的唯一差异.
什么可能是导致ValidateAntiForgeryToken验证令牌失败的问题?
问候.
我的网站每天大约20次提出这个异常,通常表单工作正常,但有些情况发生这个问题,我不知道为什么这么随机.
这是elmah记录的异常
500 HttpAntiForgery所需的防伪cookie __RequestVerificationToken"不存在.
但它正在发送由elmah在XML日志中显示的令牌的形式
<form>
<item name="__RequestVerificationToken">
<value string="DNbDMrzHmy37GPS6IFH-EmcIh4fJ2laezIrIEev5f4vOhsY9T7SkH9-1b7GPjm92CTFtb4dGqSe2SSYrlWSNEQG1MUlNyiLP1wtYli8bIh41"/>
</item>
<item name="toPhone">
<value string="XXXXXX"/>
</item>
<item name="smsMessage">
<value string="xxxxxxxx"/>
</item>
</form>
Run Code Online (Sandbox Code Playgroud)
这是我在控制器上的方法,它使用数据属性来检查令牌是否有效
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<JsonResult> Send(SMSModel model)
{
// my code goes here
}
Run Code Online (Sandbox Code Playgroud)
这是我在视图上的表单
@using (Html.BeginForm("Send", "SMS", FormMethod.Post, new { @class = "form-sms", autocomplete = "off" }))
{
@Html.AntiForgeryToken()
<div class="row">
<div class="col-md-12">
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">+53</div>
@Html.TextBoxFor(m => m.toPhone, new { @class = "form-control", placeholder = "teléfono", required = "required", type = …Run Code Online (Sandbox Code Playgroud) 我有一个表单,允许用户键入数据,然后提交.如果一切都在这个动作结果上运行良好,那么我会将用户重定向回感谢页面.
我现在的问题是,当用户点击后退按钮时,他们将能够返回到表单页面,输入仍然存在.
如果用户再次点击提交,我将获得一些潜在的奇怪错误.
那么就asp.net mvc而言,处理点击后退按钮的用户的最佳方法是什么?
谢谢!