ValidateAntiForgeryToken MVC5活用验证

闲来也无事 2019-11-09

前端

// 获取生成的token,直接这样写也是可以的
function gettoken() {
  var token = ‘@Html.AntiForgeryToken()‘;
  return $(token).val();
}

//某button的单击事件
function tijiao() {
    $.ajax({
        url:"/Default/Index2",
        type:‘post‘,
        data:{name:‘你就‘,__RequestVerificationToken:gettoken() },
        success:function (res){
            alert(res);
        }
    });
}

自定义的特性,方法执行前的特性,检查token

public class MyValidateAntiForgeryToken : AuthorizeAttribute
 {
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
            var request = filterContext.HttpContext.Request;
            if (request.HttpMethod == WebRequestMethods.Http.Post && request.Url.Host.ToLower() != WebConfigBLL.LIVE_VZAN_DOMAIN.ToLower())
            {
                HttpCookie antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
                string cookieValue = antiForgeryCookie != null ? antiForgeryCookie.Value : null;
                //从cookies 和 Headers 中 验证防伪标记 如果验证不通过会抛出异常

                try
                {
                    // AntiForgery.Validate在NetCore中没有的
                    AntiForgery.Validate(cookieValue, request["__RequestVerificationToken"]);//验证 HTML 表单字段中的输入数据是否来自已提交数据的用户。
                }
                catch (Exception ex)
                {
                    filterContext.Result = new ContentResult() { Content = "抱歉,登录异常!", ContentEncoding = System.Text.Encoding.UTF8 };
                    return;
            }
     }
  }
}

 把 MyValidateAntiForgeryToken 加到方法上

[HttpPost]
[MyValidateAntiForgeryToken]
public ActionResult Index2(int id)
{   //如果前端传值的__RequestVerificationToken验证直接返回验证错误
    return View();
}

二:ValidateAntiForgeryTokenAttribute,MVC5和NetCore 通用

<form>
    @Html.AntiForgeryToken()
    <input type="text" name="name" value="" placeholder="输入name" />
    <input type="text" name="area" value="" placeholder="输入地址" />
    <input type="submit" name="sub" value="表单提交" />
</form>

var token = $(‘[name=__RequestVerificationToken]‘)[0].value; //这样也可以拿到
$("form").submit(function () {
    $.ajax({
        url: "",
        type: ‘post‘,
       /*__RequestVerificationToken放在请求头中,是没有效果的,是必须作为参数传递的*/
       //beforeSend: function (XMLHttpRequest) {  
       // XMLHttpRequest.setRequestHeader("__RequestVerificationToken", gettoken());
       //},
        data: $("form").serializeArray() ,
        dataType: ‘json‘,
        success: function (res) {
            alert(res);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert(errorThrown);
        }
    });
    return false;
});

2.后台,使用自带API,验证错误的话,直接返回400

// [AcceptVerbs(HttpVerbs.Post)] netCore没有这个
[HttpPost]
[ValidateAntiForgeryToken] 
public JsonResult Index(IFormCollection collection)
{
    ModelState.AddModelError("", "1111111111111");
    return Json("好的");
}

相关推荐