Asp.net mvc 4 AntiForgery.Validate()与ValidateAntiForgeryToken
方法是否为System.Web.Helpers.AntiForgery.Validate(); 是否执行与[ValidateAntiForgeryToken]装饰完全相同的功能 我也在考虑更改我的注销方法:Asp.net mvc 4 AntiForgery.Validate()与ValidateAntiForgeryToken,asp.net-mvc-4,antiforgerytoken,Asp.net Mvc 4,Antiforgerytoken,方法是否为System.Web.Helpers.AntiForgery.Validate(); 是否执行与[ValidateAntiForgeryToken]装饰完全相同的功能 我也在考虑更改我的注销方法: [HttpPost] public virtual ActionResult LogOff() { if (User.Identity.Name != "") { System.W
[HttpPost]
public virtual ActionResult LogOff()
{
if (User.Identity.Name != "")
{
System.Web.Helpers.AntiForgery.Validate();
WebSecurity.Logout();
}
return RedirectToAction(MVC.Account.Login());
}
这将防止在系统因登录过期而注销时引发防伪异常。我只想确定AntiForgery.Validate()将执行与ValidateAntiForgeryToken相同的任务
我使用了一个额外的异常处理程序来捕获这个异常。但是问题仍然存在,Elmah仍然记录了此异常,我收到了许多消息。这两种方法似乎都可以验证表单中存在的AntiForgeryToken。我已经检查了程序集,ValidateAntiForgeryTokenAttribute确实调用AntiForgery.Validate方法进行验证。当验证失败时,这两种方法都将抛出HttpValidateAntiForgeryException。因此,他们是否执行相同任务的简短答案是肯定的 ValidateAntiForgeryTokenAttribute在OnAuthorization方法的MVC执行周期的早期验证令牌,这一点有细微的区别。如果在执行AntiForgeryToken.Validate()检查之前在控制器操作中执行资源密集型任务,这可能会影响性能 另一件需要注意的事情是,通过要求每个HttpPost操作具有以下代码段,您可能为自己创建了额外的工作(更不用说省略它时可能留下的安全漏洞了)
if (User.Identity.Name != "")
{
System.Web.Helpers.AntiForgery.Validate();
WebSecurity.Logout();
}
通过创建以下属性并用它装饰那些post方法,您将获得所需的功能,而不需要在每个post操作中都包含上述代码
using System;
using System.Web.Mvc;
[AttributeUsage( AttributeTargets.Method | AttributeTargets.Class , AllowMultiple = false , Inherited = true )]
public class ValidateOrSignOutAntiForgeryTokenAttribute :
FilterAttribute ,
IAuthorizationFilter
{
public void OnAuthorization( AuthorizationContext filterContext )
{
if( filterContext == null )
{
throw new ArgumentNullException( "filterContext" );
}
if( filterContext.HttpContext.User != null &&
filterContext.HttpContext.User.Identity.Name != "" )
{
try
{
System.Web.Helpers.AntiForgery.Validate();
}
catch
{
WebSecurity.Logout();
throw;
}
}
}
}
最后一件事,例外情况是正常的验证防伪。这是因为AntiForgery.Validate方法在验证失败时抛出HttpValidateAntiForgeryException。正如您在上面的代码中看到的,我捕获了此异常,并在完成注销后重新抛出它。轻微更正它抛出了一个
HttpAntiForgeryException
没有HttpValidateAntiForgeryException感谢详细的回答A.L。