我有一个表单,需要一段时间服务器来处理.我需要确保用户等待并且不再尝试通过再次单击该按钮重新提交表单.我尝试使用以下jQuery代码:
<script type="text/javascript">
$(document).ready(function() {
$("form#my_form").submit(function() {
$('input').attr('disabled', 'disabled');
$('a').attr('disabled', 'disabled');
return true;
});
});
</script>
Run Code Online (Sandbox Code Playgroud)
当我在Firefox中尝试此操作时,所有内容都被禁用,但表单未提交任何它应包含的POST数据.我不能使用jQuery提交表单,因为我需要使用表单提交按钮,因为有多个提交按钮,我确定哪个用于POST中包含哪个值.我需要像往常一样提交表单,我需要在发生后立即禁用所有内容.
谢谢!
我想阻止用户在.NET MVC中多次提交表单.我已经尝试了几种使用Javascript的方法,但很难在所有浏览器中使用它.那么,如何在我的控制器中防止这种情况呢?在某种程度上可以检测到多个提交?
我在ASP.NET MVC 4中使用默认登录模块.我没有更改默认应用程序中的任何代码,而是将其托管在共享服务器上.
我使用默认登录页面登录后.我让浏览器闲置了一段时间.然后,当我尝试使用[Authorize]属性执行任何控制器操作时,显然应用程序重定向到登录页面 .
然后我尝试再次登录,当我点击登录按钮时出现错误.
The anti-forgery cookie token and form field token do not match.
Run Code Online (Sandbox Code Playgroud)

登录操作
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
Run Code Online (Sandbox Code Playgroud) 我有一个MVC 4应用程序,并在表单会话到期时遇到问题,然后用户尝试注销.
防爆.超时设置为5分钟.用户登录.用户10分钟不做任何事情.用户单击LogOff链接.用户收到错误:"提供的防伪令牌适用于用户"XXXX",但当前用户为"".
然后,用户必须通过一些体操来解决这个问题,以便他们可以重新登录然后重新注销(注销正在用于关闭当天的时间卡).
我想我明白为什么会发生这种情况......但不知道如何解决这个问题.
编辑:为什么我认为发生这种情况是因为最初加载页面时,会为当前登录的用户生成AntiForgery令牌.但是当会话到期并且他们尝试导航到注销页面时,当前用户是""而不是实际用户.因此存在不匹配并且呈现错误.
我最近把Live使用MVC 4和Entity Framework 5构建的Web应用程序.该MVC应用程序使用剃刀意见.
我注意到使用Elmah,当用户登录应用程序时,有时他们会收到以下错误
The provided anti-forgery token was meant for user "" but the current user is "user"
Run Code Online (Sandbox Code Playgroud)
我已经就如何解决这个问题做了一些研究,但似乎没有什么对我有用.请参阅下面的我的登录视图和相应的控制器操作.
剃刀视图
@if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div class="formEl_a">
<fieldset>
<legend>Login Information</legend>
<div class="lbl_a">
Email
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.Email, new { @class = "inpt_a" })<br />
@Html.ValidationMessageFor(m => m.Email)
</div>
<div class="lbl_a">
@Html.LabelFor(m => m.Password)
</div>
<div class="editor-field sepH_b">
@Html.PasswordFor(m => …Run Code Online (Sandbox Code Playgroud) 在网页中,我们提供了用户可以点击进行身份验证的超链接(GET):
@Html.ActionLink("Please Login", "MyMethod", "MyController")
Run Code Online (Sandbox Code Playgroud)
这将映射到以下返回视图的控制器方法:
[RequireHttps]
public ActionResult MyMethod()
{
return this.View(new MyModel());
}
Run Code Online (Sandbox Code Playgroud)
此视图包含用户提供凭据的表单; 表单包含所需的AntiForgeryToken.
当用户提交表单时,将调用以下Controller方法:
[HttpPost]
[RequireHttps]
[ValidateAntiForgeryToken]
public ActionResult MyMethod(MyModel model)
{
// my logic
}
Run Code Online (Sandbox Code Playgroud)
这很好用,大部分时间......
但是,如果用户将浏览器打开一段"重要"时间,然后快速连续执行以下步骤:
他们得到一个例外,通知他们防伪令牌未提供或无效.
我不明白为什么会这样:View(包含表单)是在浏览器处于休眠状态之后创建的,因此防伪标记应该都是"新鲜的".但是,这个设计显然有问题,但我不确定如何最好地纠正它.
如果您有任何建议,请提前致谢.
格里夫
我们有一个使用MVC3的网站和一个完全不依赖于表单身份验证的自定义身份验证方法 - 至少从我能说的方面来说.在web.config中我们设置
<authentication mode="None"></authentication>
Run Code Online (Sandbox Code Playgroud)
我们永远不会在代码中的任何地方使用/设置HttpContext.User.问题是在某些情况下使用@ Html.AntiForgeryToken()时,用户会收到以下错误消息:
A required anti-forgery token was not supplied or was invalid
Run Code Online (Sandbox Code Playgroud)
我们使用以下代码集中了OnAuthorization中的所有反伪造检查:
if (String.Compare(filterContext.HttpContext.Request.HttpMethod, "post", true) == 0)
{
var forgery = new ValidateAntiForgeryTokenAttribute();
forgery.OnAuthorization(filterContext);
}
Run Code Online (Sandbox Code Playgroud)
这就是异常发生的地方.我们在web.config中定义了一个machineKey,以防止在应用程序池回收时生成新密钥.这并没有解决问题.
接下来我们认为客户的浏览器可能没有发送cookie.我们开始记录cookie并注意到在某些情况下会发送RequestVerificationToken_Lw cookie,但在其他情况下则不会 - 尽管其他cookie(如Google Analytics提供的cookie)也会被发送.可能是浏览器中的某些内容正在剥离一些cookie并让其他人进入?
似乎反伪造令牌依赖于表单身份验证.是这样的吗?任何方式在不以可靠的方式使用表单身份验证时继续使用AntiForgeryToken.请记住,我上面描述的方法适用于超过90%的情况,但我们无法确定为什么它对某些人不起作用.
思考?
谢谢!
我有一个问题,最近我在所有表单中添加了防伪令牌,并在控制器中添加了该ValidateAntiForgeryToken属性。
但我的用户经常填写表格,然后使用浏览器按钮回来,纠正其中一个错误,然后他们会获得无效的防伪令牌。
我可以理解为什么会发生这种情况(我们将返回并使用不再有效的防伪令牌),但是有什么方法可以避免这种行为吗?喜欢强制重新加载此页面吗?
我正在尝试为我的MVC3应用程序实现AntiForgeryToken.设置FormAuthentication cookie后,我遇到了AntiForgeryToken的问题.这是一个简单的例子,它解释了我的问题.
我有家庭控制器与以下行动方法:
public class HomeController : Controller
{
public ActionResult Logon()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Logon(string userName, string password)
{
FormsAuthentication.SetAuthCookie(userName, false);
return View("About");
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult About(FormCollection form)
{
return View("PageA");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的登录和关于视图:
Logon.cshtml:
@using (Html.BeginForm("Logon", "Home"))
{
@Html.AntiForgeryToken()
<label> UserName :</label>
<input name = "userName" type="text"/>
<br />
<label> Password :</label>
<input name = "password" type="password"/>
<br />
<br />
<input type="submit" value="LogOn" />
}
Run Code Online (Sandbox Code Playgroud)
About.cshtml
@using (Html.BeginForm("About", "Home"))
{ …Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×7
csrf ×2
asp.net ×1
c# ×1
forms ×1
http-post ×1
javascript ×1
jquery ×1
razor ×1
security ×1