1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击

在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击

时间:2018-09-15 04:43:34

相关推荐

在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击

什么是跨站请求伪造

跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。【1】跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

想了解更多,请查看维基百科上的详细介绍。

使用 Core 内置的 Antiforgery

Core 应用中内置了Microsoft.AspNetCore.Antiforgery包来支持跨站请求伪造。如果你的应用引用了Microsoft.AspNetCore.App包, 则就已经包含了Microsoft.AspNetCore.Antiforgery。如果没有, 则可以使用下面的命令来添加这个包:

dotnet add package Microsoft.AspNetCore.Antiforgery

添加了这个包之后, 需要先修改Startup.cs文件中的ConfigureServices方法, 添加下面的配置:

public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddAntiforgery(options => {options.Cookie.SameSite = SameSiteMode.Lax; options.HeaderName = "X-XSRF-TOKEN"; }); }}

SecurityController.cs文件中添加一个 Api , 来颁发凭据:

[Route("api/[controller]")][ApiController]public class SecurityController : Controller { private IAntiforgery antiforgery; public SecurityController( IAntiforgery antiforgery ) { this.antiforgery = antiforgery; } [HttpGet("xsrf-token")] public ActionResult GetXsrfToken() { var tokens = antiforgery.GetAndStoreTokens(HttpContext); Response.Cookies.Append("XSRF-TOKEN",tokens.RequestToken,new CookieOptions { HttpOnly = false, Path = "/", IsEssential = true, SameSite = SameSiteMode.Lax} ); return Ok(); }}

当客户端请求~/api/security/xsrf-token时, 服务端发送两个 Cookie :

.AspNetCore.Antiforgery.xxxxxx一个 HTTP Only 的 Cookie , 用于服务端验证;

XSRF-TOKEN客户端需要将这个 Cookie 的值用 X-XSRF-TOKEN 的 Header 发送回服务端, 进行验证;

注意:这两个 Cookie 不支持跨域请求, 只能在相同的站点内请求, 也是出于安全性方面的考虑。

可以为某一个 ApiController 或者 Action 方法单独添加ValidateAntiForgeryTokenAttribute标记来验证XSRF-TOKEN, 也可以全局注册一个AutoValidateAntiforgeryTokenAttribute过滤器来进行自动验证, 代码如下:

public class Startup { public void ConfigureServices( IServiceCollection services, IHostingEnvironment env ) { services.AddMvc(options => { if (env.IsProduction()) { options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute() );} }); }}

注意问题:不是所有的方法都需要进行 XSRF 认证,除了 GET, HEAD, OPTIONS 和 TRACE 之外的方法才支持 XSRF 认证。

Angular 内置支持

Angular 的 Http 模块内置支持 XSRF , 前提条件如下:

存在客户端可以操作的名称为XSRF-TOKEN的 Cookie ;

该 Cookie 不能是 HttpOnly 的, 否则客户端脚本无法读取;

该 Cookie 的 Path 必须为/

这三个条件都满足, 则在向服务端请求时自动发送名称为X-XSRF-TOKEN的 Header , 值则为XSRF-TOKEN的 Cookie 的值, 这样就回自动满足上面的服务端的设置, 实现自动防御跨站请求伪造。

原文地址:https://beginor.github.io//05/27/anti-forgery-with-asp-net-core-and-angular.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。