前言

本文基于官方文档 《在 ASP.NET Core 防止跨站点请求伪造 (XSRF/CSRF) 攻击》扩展另一种全局配置Antiforgery方法,适用于使用ASP.NET Core Razor + JQuery Ajax的项目,喜欢玩前后端分离的同学可以酌情参考,但希望不要对XSRF/CSRF掉以轻心,更不要不做处理。

Antiforgery Token 介绍

跨站点请求伪造(XSRF/CSRF)攻击跟浏览器中登录验证之后保存的Cookie有关,恶意站点通过向攻击目标站点发起非法请求时,浏览器按规则是会带上Cookie信息的,此时被攻击站点就会认为是用户操作行为,如果被利用在修改密码等操作上,对用户的信息安全就会带来威胁。为抵御 CSRF 攻击最常用的方法是使用同步器标记模式(STP)。 而Antiforgery Token(防伪令牌)是ASP.NET Core中的STP实现方案。

STP的防御过程:

  1. 服务器发送到客户端的当前用户的标识相关联的令牌。
  2. 客户端返回将令牌发送到服务器进行验证。
  3. 如果服务器收到与经过身份验证的用户的标识不匹配的令牌,将拒绝请求。

熟悉ASP.NET和ASP.NET Core的同学应该都不陌生,因为在ASP.NET时期就有防止XSRF攻击的方法,ASP.NET MVC中,IHtmlHelper.BeginForm默认情况下生成防伪令牌,而ASP.NET Core中,使用FormTagHelper默认也会生成防伪令牌的。

解决方案

Form表单提交

TagHelper用法:

<form asp-controller="Manage" asp-action="ChangePassword" method="post">
...
</form>

HtmlHelper 生成Form的用法:

@using (Html.BeginForm("ChangePassword", "Manage"))
{
...
}

普通html form表单用法:

<form action="/" method="post">
@Html.AntiForgeryToken()
</form>

那么在Razor渲染之后,表单中就会生成一个隐藏的表单字段:

<input name="__RequestVerificationToken" type="hidden" value="CfDJ8NrAkS ... s2-m9Yw">

那么Ajax中要怎么处理呢?

官方文档虽然有提到Ajax的处理方法,但是它指的Ajax是js原生实现XMLHttpRequest,而不是我们一般所认识的JQuery.ajax。所以本文就要介绍一下在使用JQuery.ajax时的全局配置。

场景一、从普通表单获取Antiforgery Token

这种方法跟上面提到的Form表单提交一致,只要把所生成的隐藏的表单字段也一并提交到服务器即可。


$.ajax({
url:"/Manage/ChangePassword",
type:"post"
data: { "__RequestVerificationToken":"CfDJ8NrAkS ... s2-m9Yw" }
})

但是这种方法有个弊端,就是需要配置的东西很多,又要在Contorller中加[ValidateAntiForgeryToken]特性,又要在表单中处理使其生成隐藏字段。

有没有更方便的方法?当然有!而且即使是文档中号称自动防范 XSRF/CSRF的Razor Pages都同样需要!因为它并没有处理Ajax的场景。

场景二、全局配置,自动处理

全局获取Forgery Token

全局(每个页面)获取Forgery Token就是文档中提到的注入Microsoft.AspNetCore.Antiforgery.IAntiforgery并调用GetAndStoreTokens方法,但是由于需要达到全局获取,我需要把这个方法的调用写到布局页,如默认MVC模版的Views/Shared/_Layout.cshtml

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
public string GetAntiXsrfRequestToken()
{
return Xsrf.GetAndStoreTokens(Context).RequestToken;
}
} <script>
var csrfToken = '@GetAntiXsrfRequestToken()';
</script>

Ajax全局配置

JQuery.ajax里全局设置头部的方法是$.ajaxSetup,按照文档,把所需的头部字段RequestVerificationToken配置上上面获取到的令牌变量csrfToken,即可实现在每个Ajax请求都带有Forgery Token。

(function (window, document, $) {
$.ajaxSetup({
headers: {
'RequestVerificationToken': csrfToken
}
});
})(window, document, jQuery);

总结

虽然现在流行前后端分离了,包括我在内,也用上高大上的React、Angular、Vue等优秀框架,Github前端也把JQuery去掉了,但是Razor在ASP.NET Core中的份量有增无减,2.0版本带来了更轻量的Razor Pages, 因此Razor+JQuery的热度不会那么快退去,希望这篇文章能给大家在Razor+JQuery技术的使用过程中带来一点参考价值。

ASP.NET Core 中的Ajax全局Antiforgery Token配置的更多相关文章

  1. ASP.NET Core中返回 json 数据首字母大小写问题

    ASP.NET Core中返回 json 数据首字母大小写问题 在asp.net core中使用ajax请求动态绑定数据时遇到该问题 后台返回数据字段首字母为定义的大写,返回的数据没有问题 但是在前台 ...

  2. 在ASP.NET Core中通过EF Core实现一个简单的全局过滤查询

    前言 不知道大家是否和我有同样的问题: 一般在数据库的设计阶段,会制定一些默认的规则,其中有一条硬性规定就是一定不要对任何表中的数据执行delete硬删除操作,因为每条数据对我们来说都是有用的,并且是 ...

  3. ASP.Net Core中使用jquery-ajax-unobtrusive替换Ajax.BeginForm

    在大潮流下,大家都在研究MVVM框架,但是做面向搜索引擎的外网项目还是得用服务器渲染. 在.Net中肯定就是用Razor模板引擎了. .Net Core断臂式重构后,很多在老得Mvc中使用得好好的一些 ...

  4. ASP.NET Core中的jQuery Unobtrusive Ajax帮助器

    最近在ASP.NET Core下写文章管理系统时,准备在分页显示文章内容时,使用Ajax.网上找了篇帖文,简单翻一下,仅供自己查阅. 原链接:https://dotnetthoughts.net/jq ...

  5. 初探CSRF在ASP.NET Core中的处理方式

    前言 前几天,有个朋友问我关于AntiForgeryToken问题,由于对这一块的理解也并不深入,所以就去研究了一番,梳理了一下. 在梳理之前,还需要简单了解一下背景知识. AntiForgeryTo ...

  6. Asp.Net Core中Json序列化处理整理

    一.Asp.Net Core中的Json序列化处理使用的是Newtonsoft.Json,更多参考:C# Newtonsoft.Json JsonSerializerSettings配置序列化操作,C ...

  7. 第十五节:Asp.Net Core中的各种过滤器(授权、资源、操作、结果、异常)

    一. 简介 1. 说明 提到过滤器,通常是指请求处理管道中特定阶段之前或之后的代码,可以处理:授权.响应缓存(对请求管道进行短路,以便返回缓存的响应). 防盗链.本地化国际化等,过滤器用于横向处理业务 ...

  8. 第十四节:Asp.Net Core 中的跨域解决方案(Cors、jsonp改造、chrome配置)

    一. 整体说明 1. 说在前面的话 早在前面的章节中,就详细介绍了.Net FrameWork版本下MVC和WebApi的跨域解决方案,详见:https://www.cnblogs.com/yaope ...

  9. ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化

    原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...

随机推荐

  1. i++为什么是线程不安全的

    主要是因为i++这个操作不是原子性的,它会编译成 i = i +1: 其实是做了3个步骤,一个是读取,修改,写入 .所以会出现多线程访问冲突问题. 可以结合Java内存模型来进行说明.

  2. [Vue]实例化Vue时的两种挂载方式el与$mount

    Vue 的$mount()为手动挂载,在项目中可用于延时挂载(例如在挂载之前要进行一些其他操作.判断等),之后要手动挂载上.new Vue时,el和$mount并没有本质上的不同. 1.el Vue实 ...

  3. hand first python 选读(2)

    文件读取与异常 文件读取与判断 os模块是调用来处理文件的. 先从最原始的读取txt文件开始吧! 新建一个aaa.txt文档,键入如下英文名篇: Li Lei:"Hello,Han Meim ...

  4. C++中输入输出十六进制八进制

    本文参考链接:https://www.cnblogs.com/hxsyl/archive/2012/09/18/2691693.html,经重新实验得此文 1.进制问题 默认情况下使用cin和cout ...

  5. 理解JAVA MQ消息中间件

    MQ的几种消息传递方式 发布订阅模式 发布订阅模式有点类似于我们日常生活中订阅报纸.每年到年尾的时候,邮局就会发一本报纸集合让我们来选择订阅哪一个.在这个表里头列了所有出版发行的报纸,那么对于我们每一 ...

  6. Docker 学习记录笔记(一)

    Docker 一些简单的命令列表docker build -t friendlyhello . # Create image using this directory's Dockerfiledock ...

  7. UVA-11367 Full Tank? (dijkstra)

    题目大意:有n个加油站,每个加油站的油价已知,并且已知油箱的大小,问能否从起点走到终点,若能,找出最小油费. 题目分析:记得在做暴力搜索的时候做过这道题,不算难.但是这次是用dijkstra算法做的, ...

  8. mvc框架详解

    mvc全称:Model View Controller,分别为Model(模型),View(视图),Controller(控制器). 这张图就很好的解释了MVC框架的基本工作原理,Modal通常为后台 ...

  9. centos7&redhat 之 firewalld 详细介绍配置

    firewalld和iptables的关系 firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和iptables一 ...

  10. 优先队列PriorityQueue实现 大小根堆 解决top k 问题

    转载:https://www.cnblogs.com/lifegoesonitself/p/3391741.html PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于 ...