axios发送请求,后端报错:所需的防伪表单字段“__RequestVerificationToken”不存在

14 篇文章 0 订阅

后端使用.net mvc开发,前端使用axios发送post请求遇到错误:所需的防伪表单字段“__RequestVerificationToken”不存在。

看到此提示我们知道原因是:MVC的跨站攻击(CSRF)安全机制获取不到__RequestVerificationToken。但是不知道axios如何传参才能让后端的安全机制获取到,百度各种搜索半天后扔未果,后来想办法 google,秒获答案 (谷歌真不是吹的,牛!!),虽然不是正面解决,但解决方案依然很满意 、很优秀,解决方法如下:

1、新建一个过滤器

    /// <summary>
    /// axios不能通过跨站验证,因此自定义验证方法,action方法上要标记此过滤器名称
    /// </summary>
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
    public sealed class ValidateAntiForgeryToken2Attribute : FilterAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("fail");
            }
            var httpContext = filterContext.HttpContext;
            //AntiForgeryConfig.CookieName 默认等于__RequestVerificationToken
            var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
            AntiForgery.Validate(cookie != null ? cookie.Value : null, httpContext.Request.Headers["__RequestVerificationToken"]);
        }
    }

2、Action方法上 之前使用默认的过滤器“ValidateAntiForgeryToken”,现在换成我们自定义的:“ValidateAntiForgeryToken2”

3、前端axios发送请求时在headers中写入“__RequestVerificationToken” 这是默认名称,如果您自定义了名称请换成自定义的名称 ,在axios全局配置中写入__RequestVerificationToken:

axios.create({
    headers: {
        "__RequestVerificationToken": document.querySelector("input[name=__RequestVerificationToken]").value,
    },
});

完!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值