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("好的");
}

 

 

 

 

posted @   大意了啊  阅读(1169)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
主题色彩