在无状态 ASP.NET Core 8 Web API 中实现 CSRF 令牌,无需 Views/MVC!

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

之所以要写这篇文章,是因为找不到其他好的教程。看到的搜索结果全是关于服务器端渲染视图的。所以花了数个小时在网上搜索,学习了 CSRF 令牌、cookie 以及所有相关的知识。最终,对这个主题有了相当全面的了解。

后端环境基于.NET,前端环境则是一个客户端渲染项目。
以下是详细搭建步骤。

首先,对 Program.cs 文件进行了修改:

using Microsoft.AspNetCore.Antiforgery;

builder.Services.AddAntiforgery(options =>

{

options.Cookie = new CookieBuilder {

HttpOnly = true, // for security purposes, this means that when csrf endpoint responses with "set-cookie" header then the cookie is httpOnly which means the cookie is stored to the browser, BUT webpage's javascript can't access it.

Domain = "your-site-url-here.com",

Expiration = new TimeSpan(TimeSpan.TicksPerMinute),

Path = "/", // I had to put it to just a slash, otherwise the set-cookie would work for me. Maybe some configuration can fix other paths.

Name = "csrf"

// SameSite = SameSiteMode.None, // for localhost I had to use SameSite.None, but in test server it broke things for me.

// SecurePolicy = CookieSecurePolicy.Always // for localhost I had to use it according to Chrome's dev tool network tab for the set-cookie to apply to cookies. But did not need it in test server.

},

options.HeaderName = "X-CSRF-TOKEN"; // This name is also important, because the same name must be present in your request's headers from frontend

options.SuppressXFrameOptionsHeader = false; // For Clickjacking

});

builder.Services.AddControllersWithViews(options => {

// Only AddControllersWithViews works, "AddControllers" is not enough here.

options.Filters.Add(new Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute());

// Adds CSRF token validation to all controllers and their actions

});

// after var app = builder.Build();

app.UseAntiforgery();

然后添加了一个用于获取 CSRF 令牌的控制器:

using Microsoft.AspNetCore.Antiforgery;

using Microsoft.AspNetCore.Authorization;

using Microsoft.AspNetCore.Mvc;

namespace Your.Controllers;

ApiController

Route("api/csrf")

public class CsrfController(IAntiforgery antiforgery) {

HttpGet("")

AllowAnonymous

IgnoreAntiforgeryToken

// So the CSRF token validation is turned off for this action because you have to get an acces to this endpoint always for a token.

public IActionResult GetCsrf() {

var tokenSet = antiforgery.GetAndStoreTokens(HttpContext); // This generates the tokens for your cookies and requests and adds needed response headers for your browser.

// The response contains the request token as in "Ok" method and if you look in browser response headers then there is "set-cookie" named header which contains cookie token which is automatically set to your browsers cookies which are inaccessible for javascript but the csrf cookie is sent automatically with the next request you make from frontend.

return Ok(tokenSet.RequestToken);

}

}

最后,预先从前端对所有 API 请求应用了 CSRF 令牌获取机制:

const getCsrfToken = async () => {

return fetch(`${APIURL}/api/csrf`)

.then(data => data.json())

.catch(error => console.error("Error fetchin CSRF token: ", error))

}

const apiFetch = async (url, params..., and so on) => {

const csrfResult = await getCsrfToken();

// in your fetch add "X-CSRF-TOKEN" to headers with value <csrfResult> (or request_token, depending on your casing settings in backend)

}

希望这篇文章对大家有所帮助。如果发现任何错误,请随时留言指正。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
子兮曰16 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰16 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万16 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝16 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋17 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁17 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王952719 小时前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大19 小时前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师19 小时前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学20 小时前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端