【ASP.NET Core】解决“The required antiforgery cookie xxx is not present”的错误
当你在页面上用 form post 内容时,可能会遇到以下异常:
The required antiforgery cookie "????????" is not present.
咱们来重现一下错误。新建一个 ASP.NET Core 项目,模板选【空】就行了,这是老周最喜欢的项目模板,空 == 自由。
在项目下建一个目录,叫 Pages,用来放 Razor 页面;然后建一个 Index.cshtml 页。
之所以叫 Index.cshtml,是因为 Index 是默认页的名字,这样输入根 URL 就能访问。如果不叫 Index 呢,比如这样。
此时你可以在根 URL 后面加上 demo 来访问,如果想在根目录下访问,也可以在 Startup.ConfigureServices 方法中配置页面路由。
public void ConfigureServices(IServiceCollection services){services.AddMvc().AddRazorPagesOptions(o =>{ o.Conventions.AddPageRoute("/Demo", "");});}
写路径时一定要注意大小写,在浏览器中输入时不需要注意,但在编程时要注意。AddPageRoute 方法是个扩展方法,pagename 参数表明你要的目标页面,比如我要到达 /Demo 页,route 参数设置路由,空字符串表示根路径。即我在浏览器中输入 http://somehost/,就能定位到 http://somehost/Demo 页。
如果 pagename 为 /users/newone,route 参数为 new,那么,你访问 http://somehost/new 就会指向 http://somehost/users/newone。
你得注意的是,这个 razor page 的路由规则只用于 Web Pages,不是 MVC 的路由规则,这个设置对 MVC 是不起作用的,MVC 可以用类似 {controller]/{action}/{id} 的路由,这个相信你很熟练了(当然,前提是你写过 MVC 应用)。
顺便在 Configure 方法中加上 use 代码,不管是 Web Pages 还是 MVC 都要加上。
public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();} app.UseMvc();}
现在可以弄一下页面了。打开页面,你发现找不到对应的 PageModel 类,这里老周推荐用 _ViewImports 文件来处理。
在 Pages 目录下添加一个视图导入文件。
然后,引入要用的命名空间。
@using WebSample09 @using WebSample09.Pages
但是这不够完善,还要加一行。
@namespace WebSample09.Pages
@namespace 指令用来设定 Razor 页所生成代码的命名空间,这样就可以确保页面与 PageModel 类型处于同一个命名空间,可以避免将来发生各种错误。
保存并关闭导入页,回到刚刚添加的页面。
@page @model DemoModel<!doctype html> <html> <head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" /><title>示例</title> </head> <body><form method="post"><label for="parm">请随便输入:</label><input type="text" name="parm" /><button type="submit">提交</button></form> </body> </html>
打开对应的 PageModel 类代码,写一个 OnPost 方法。
public void OnPost(string parm){ViewData["data"] = $"你输入的的值是:{parm}";}
在 POST 之后,通过 parm 参数(与页面 form 元素中字段命名相同,会自动赋值)获取输入的内容,存到 ViewData 中,为了在页面上显示,我们回到刚才的页面,加一个 p 元素,用来显示输入内容。
<p>@ViewData["data"]?.ToString()</p>
好,现在可以测试了。
运行,进入页面。
输入内容,点按钮提交,会收到 400 错误。
此时 Console Log 记录下一个异常。
即我们开头所说的那个错误,这个验证主要为了安全考虑,防止别人盗了你的数据然后跨域欺骗服务器。
那么,咋解决呢?说出来你可能不信,很简单。
打开刚刚咱们加到项目中的那个视图导入页,然后添加一个 form 元素的 Tag Helper 就行了。
@addTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.FormTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers
格式是这样的,很常规,就是 .net 类型的表示方法,用英文的逗号隔开,前面是类型(包括命名空间),后面是程序集名称。
添加标记帮助器前,代码编辑器中是显示为这种颜色的。
添加标记帮助器后,显示为这种颜色。
这时候就可以了。
咱们不妨对比一下,看看应用标记 Helper 前后输出到客户端的 HTML 有啥不同。
在未使用标记帮助器前,提交时会出现 400 错误,生成的 HTML 如下:
<form method="post"><label for="parm">请随便输入:</label><input name="parm" type="text"><button type="submit">提交</button> </form>
基本是原文输出。
应用 form 元素帮助器后,生成的 HTML 如下:
<form method="post"><label for="parm">请随便输入:</label><input name="parm" type="text"><button type="submit">提交</button><input name="__RequestVerificationToken" type="hidden" value="CfDJ8DEAGDEorWJFuzYOfcGEJpSWrKHd5Qrw4jdARVRF3SwAS-TChnUQHEsFWxtXTk7IDCmpRAB241ucR6kdZA-sRBHnsyOe01ymGLs-DONlZYmB-MzvmXgJmKcn2ZrYMN-Br8fj25nX_zvuwzhyNQ42Das" /></form>
多了一个名为 __RequestVerificationToken 的隐藏元素,标识当前请求会话,防止被人冒用。
顺便补充一下,如果你想导入各种 Tag Helper ,可以把类型名改为 * (星号,通配符)。
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
好了,今天的内容扯到这儿了,88。
【ASP.NET Core】解决“The required antiforgery cookie xxx is not present”的错误相关推荐
- Required string parameter ‘XXX‘ is not present
一.错误描述 写了一个页面登录的方法,在进行页面登录的时候,控制台会报类似Required String parameter 'XXX' is not present 错误. 1.错误信息 控制台日志 ...
- ASP.NET Core 认证与授权[2]:Cookie认证
ASP.NET Core 认证与授权[2]:Cookie认证 原文:ASP.NET Core 认证与授权[2]:Cookie认证 由于HTTP协议是无状态的,但对于认证来说,必然要通过一种机制来保存用 ...
- Required String parameter XXX is not present
仅限于我在后台开发调试中遇到的这个问题,并且找到原因,解决的. H5前端调Springboot后台接口时,报了以下错误: 这个问题之前也遇到过,只是忘了怎么解决的,什么原因导致的. 这次又遇到了这个问 ...
- mybaties :required string parameter ‘XXX‘is not present
情况一:原因是由于头文件类型不对,可以在MediaType中选择合适的类型,例如GET和POST 情况二:jquery提交delete时,不支持@RequestParam,只支持@PathVariab ...
- Required Integer[] parameter ‘xxx‘ is not present”报错的解决方案
背景 在使用批量删除的时候,前端同学说报错了. 自我调试了下,发现Required Integer[] parameter 'xxx' is not present 方法在后端使用的是post的方式. ...
- ASP.NET Core 解决控制台输出日志内容前面[40m等乱码字符
在默认我写了一个 WPF 程序去做管理 ASP.NET Core 进程的日志的时候,重定向输出的内容里面每一行前面都添加了很多乱码字符串.其实这是 ASP.NET Core 控制台的颜色字符,解决方法 ...
- ASP.NET Core 中文文档 第三章 原理(5)错误处理
原文:Error Handling 作者:Steve Smith 翻译:谢炀(Kiler) 校对:高嵩(jack2gs).何镇汐 当你的ASP.NET应用发生错误的时候, 你可以采用本文所述的各种方法 ...
- 报错:Required String parameter 'XXX' is not present错误的几种可能性
背景了解: 同事对代码做了改动,他在后台把原本接收的参数"username"改成了"id",没有把修改的事情通知我.拿到代码运行后发现前台网页的内容显示不完整了 ...
- Required String parameter 'xxx' is not present
学习SpringCloud Feign时,通过url访问Controller,后台报错 2018-03-21 21:05:09.849 INFO 31732 --- [nio-8765-exec-1] ...
最新文章
- 数据仓库系列1-高质量数据建模
- java 升级1.8_升级系统中的java到1.8版本详解
- 自动加载 autoload
- SAP系统上线支持维护制度
- 嘘!偷偷教你们一个在双十一省钱的办法!
- 学计算机的第一年能带电脑吗,大一新生有必要带电脑去学校吗?辅导员给出建议,家长需提前了解...
- Java并发编程-ReentrantLock
- 向前欧拉公式例题_小学语文阅读理解答题万能公式,简单实用!
- 机器学习实战——岭回归、缩减法
- 线程池的使用和工作原理
- cocos2dx基础篇(14)——基本绘图DrawPrimitives
- 别再售卖 5块钱 的 Win10 激活码了,后果很严重
- 机器学习(1)-项目 0: 预测泰坦尼克号乘客生还率
- 生成对抗网络的判别器_生成对抗网络的随机天气发生器
- MediaCodec编码后视频时长不正确的问题
- 将一个多段线按一些点分割成一个或多个线段
- 中国各省省会城市的坐标地址信息
- 推荐7个冷门手机APP,每一个都让我相见恨晚
- Excel vlookup筛选两列的重复项
- 短信开发:收不到短信通知的解决办法