ValidateAntiForgeryToken MVC5活用驗證


前端

// 獲取生成的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("好的");
}

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM