【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

时间:2022-10-02 10:18:41

当你在页面上用 form post 内容时,可能会遇到以下异常:

The required antiforgery cookie "????????" is not present.

咱们来重现一下错误。新建一个 ASP.NET Core 项目,模板选【空】就行了,这是老周最喜欢的项目模板,空 == *。

在项目下建一个目录,叫 Pages,用来放 Razor 页面;然后建一个 Index.cshtml 页。

【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

之所以叫 Index.cshtml,是因为 Index 是默认页的名字,这样输入根 URL 就能访问。如果不叫 Index 呢,比如这样。

【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

此时你可以在根 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 目录下添加一个视图导入文件。

【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

然后,引入要用的命名空间。

@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>

好,现在可以测试了。

运行,进入页面。

【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

输入内容,点按钮提交,会收到 400 错误。

【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

此时 Console Log 记录下一个异常。

【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

即我们开头所说的那个错误,这个验证主要为了安全考虑,防止别人盗了你的数据然后跨域欺骗服务器。

那么,咋解决呢?说出来你可能不信,很简单。

打开刚刚咱们加到项目中的那个视图导入页,然后添加一个 form 元素的 Tag Helper 就行了。

@addTagHelper  Microsoft.AspNetCore.Mvc.TagHelpers.FormTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers

格式是这样的,很常规,就是 .net 类型的表示方法,用英文的逗号隔开,前面是类型(包括命名空间),后面是程序集名称。

添加标记帮助器前,代码编辑器中是显示为这种颜色的。

【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

添加标记帮助器后,显示为这种颜色。

【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

这时候就可以了。

【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

咱们不妨对比一下,看看应用标记 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”的错误的更多相关文章

  1. required string parameter XXX is not present

    @RequestParam jQuery调用方式: deleteFile: function(filePath) { return ajax({ method: 'POST', url: '/cm/s ...

  2. required string parameter &&num;39&semi;XXX&&num;39&semi;is not present 的几种情况

    required string parameter 'XXX'is not present 的几种情况 情况一:原因是由于头文件类型不对,可以在MediaType中选择合适的类型,例如GET和POST ...

  3. 报错:required string parameter XXX is not present

    报错:required string parameter XXX is not present 不同工具发起的get/delete请求,大多数不支持@RequestParam,只支持@PathVari ...

  4. asp&period;net core 登录身份认证(Cookie)

    asp.net core 2最简单的登录功能 源代码在此 创建asp.net core Web Mvc项目 配置下选项 项目目录结构 在Models文件夹下新建两个实体类 public class T ...

  5. ASP&period;NET Core 认证与授权&lbrack;2&rsqb;&colon;Cookie认证

    由于HTTP协议是无状态的,但对于认证来说,必然要通过一种机制来保存用户状态,而最常用,也最简单的就是Cookie了,它由浏览器自动保存并在发送请求时自动附加到请求头中.尽管在现代Web应用中,Coo ...

  6. Asp&period;net Core认证和授权:Cookie认证

    关于asp.net core 的文章,博客园已经有很多大牛写过了. 这里我只是记录下自己在学习中的点滴和一些不懂的地方 Cookie一般是用户网站授权,当用户访问需要授权(authorization) ...

  7. 使用ASP&period;NET Core 3&period;x 构建 RESTful API - 3&period;3 状态码、错误&sol;故障、ProblemDetails

    HTTP状态码 HTTP状态码会告诉API的消费者以下事情: 请求是否执行成功了 如果请求失败了,那么谁为它负责 HTTP的状态码有很多,但是Web API不一定需要支持所有的状态码.HTTP状态码一 ...

  8. Required Integer parameter &&num;39&semi;XXX&&num;39&semi; is not present

    1.异常提示: DEBUG o.s.w.s.m.m.a.ServletInvocableHandlerMethod - Error resolving argument [2] [type=java. ...

  9. ASP&period;NET Core 认证与授权&lbrack;2&rsqb;&colon;Cookie认证 (笔记)

    原文链接:https://www.cnblogs.com/RainingNight/p/cookie-authentication-in-asp-net-core.html 由于HTTP协议是无状态的 ...

随机推荐

  1. Struts2中通过超链接传参数要注意的问题

    写到分页的功能,在传递页码pageNo的时候遇到了参数接收不正确的问题,我本来在action中是定义了一个pageNo字符串参数和一个Page类参数,Page是一个封装了页面要显示的数据集合和页面信息 ...

  2. Nginx--&gt&semi;进阶--&gt&semi;原理--&gt&semi;Nginx&plus;php&plus;fastcgi的原理与关系

    一.用户对动态PHP网页访问过程 用户浏览器发起对网页的访问:http://192.168.1.103/index.php 用户和nginx服务器进行三次握手进行TCP连接(忽略包括nginx访问控制 ...

  3. Django教程:第一个Django应用程序&lpar;3&rpar;

    Django教程:第一个Django应用程序(3) 2013-10-08 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 #博客: ...

  4. BrnShop:自定义插件

    BrnShop开源网上商城第四讲:自定义插件 重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www ...

  5. 团队作业4——第一次项目冲刺(Alpha版本) Day4

    借的今天有课,我们团队在课间时间开了简短的会议 2.Leangoo任务分解图: 3.会议结果,和任务分配 队员 今日进展 明日安排 林燕 试编写签到.请假功能的代码雏形 签到.请假功能成熟 王李焕 和 ...

  6. Javascript 3&period;2

    对象的三种类型:1.用户定义对象:程序员自己创建的对象 2.内建对象:Javascript语言中的固定对象,如Array/Math/Data等 3.宿主对象:由浏览器提供的对象 BOM:浏览器对象模型 ...

  7. &lbrack;Vue warn&rsqb;&colon; Duplicate keys detected&colon; &&num;39&semi;1&&num;39&semi;&period; This may cause an update error

    今天遇到这个问题,遇到这个问题多数因为:key值的问题 第一种情况(key重复) <div class="name-list" v-for="(item,index ...

  8. 70个注意的Python小Notes

    Python读书笔记:70个注意的小Notes 作者:白宁超 2018年7月9日10:58:18 摘要:在阅读python相关书籍中,对其进行简单的笔记纪要.旨在注意一些细节问题,在今后项目中灵活运用 ...

  9. &lbrack;原&rsqb;单片机&sol;Stm32教程

    1 http://www.amobbs.com/forum.php?mod=viewthread&tid=4462962 2.http://bbs.21ic.com/forum.php?mod ...

  10. Docker集群管理(一)—— 基础docker&plus;swarm&plus;shipyard

    目的 学习docker的集群管理,摸索出高可用的docker微服务架构方案.本篇文章只初步的了解下swarm(docker新版已集成了swarm)的使用,了解docker的发现服务的基础方法(dock ...