我正在尝试为我的 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");
}
}
这是我的登录和关于视图:
登录.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" />
}
关于.cshtml
@using (Html.BeginForm("About", "Home"))
{
@Html.AntiForgeryToken()
<p> This is conent of page About</p>
<input name = "moreInfo" type="text"/>
<input type="submit" value="SubmitAbout" />
}
我对“登录”发布方法没有问题。它正在验证 antiforgerytoken 并呈现“关于”视图。有趣的是,当我在“关于”视图上发帖时,我收到错误“未提供所需的防伪令牌或该令牌无效”
有人可以指出我在这里做错了什么吗?
感谢你的帮助。
我做了一些测试,并确定即使在你打电话之后FormsAuthentication.SetAuthCookie(...)
,问题是httpContext.User.Identity.Name
在请求期间仍为空。
因此,要解决这个问题,需要手动设置当前User
as so:
FormsAuthentication.SetAuthCookie(email, true);
this.HttpContext.User = new GenericPrincipal(new GenericIdentity(email), null);
这将设置正确的User
当Html.AntiForgeryToken()
叫做。
请注意,对于普通的 PRG 模式网站来说,此代码不是必需的,因为重定向后,正确的User
将被加载。
另外,既然你的Logon
方法需要有效的用户名和密码,它不太容易受到 CSRF 攻击,因此您可能不需要使用ValidateAntiForgeryToken
就那个方法。也许这就是 AntiForgeryToken 依赖于用户名的原因。 CSRF 攻击通常仅利用已经经过身份验证的用户。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)