Blazor Web应用接收CURL POST请求的防伪造令牌验证问题咨询
一、Blazor应用端的正确配置
1. 后端端点启用防伪造验证
如果你的/data是Minimal API端点,需在Program.cs中配置并验证令牌:
builder.Services.AddAntiforgery(options => { options.HeaderName = "X-CSRF-TOKEN"; // 指定令牌的请求头名称 }); var app = builder.Build(); app.MapPost("/data", async (HttpContext context, IAntiforgery antiforgery) => { // 验证防伪造令牌 await antiforgery.ValidateRequestAsync(context); // 读取POST表单数据 var formData = await context.Request.ReadFormAsync(); var keyValue = formData["key"]; return Results.Ok($"Received: {keyValue}"); });
如果是MVC Controller,需添加[ValidateAntiForgeryToken]特性:
public class DataController : Controller { [HttpPost("/data")] [ValidateAntiForgeryToken] public async Task<IActionResult> Post() { var formData = await Request.ReadFormAsync(); var keyValue = formData["key"]; return Ok($"Received: {keyValue}"); } }
2. Blazor组件内正确发送请求
Blazor框架会自动为HttpClient注入防伪造令牌,只需使用相对路径并构造合法的POST内容:
@page "/Data" @inject HttpClient httpClient <PageTitle>Data</PageTitle> <h1>POST:</h1> <p>@(rqData != null ? rqData : "NoData!")</p> @code { private string? rqData; protected override async Task OnInitializedAsync() { await GetData(); } private async Task GetData() { try { // 构造表单数据 var formContent = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("key", "valueFromBlazor") }); // 使用相对路径发送请求,框架自动携带令牌 HttpResponseMessage response = await httpClient.PostAsync("/data", formContent); response.EnsureSuccessStatusCode(); rqData = await response.Content.ReadAsStringAsync(); } catch (HttpRequestException e) { rqData = "Error: " + e.Message; } } }
二、CURL测试带令牌的请求
CURL是外部请求,需手动获取令牌并携带:
1. 获取防伪造令牌
先请求Blazor页面,保存Cookie并提取页面中的__RequestVerificationToken值:
# 保存Cookie到本地文件,同时获取页面内容 curl -c cookies.txt https://localhost:7084/Data
从返回的HTML代码中找到类似以下的隐藏字段,复制其value值(记为TOKEN_VALUE):
<input name="__RequestVerificationToken" type="hidden" value="xxxxxxxxx">
2. 发送带令牌的POST请求
方式1:将令牌放在表单数据中
curl -b cookies.txt -X POST https://localhost:7084/data \ -d "key=valueFromCurl&__RequestVerificationToken=TOKEN_VALUE"
方式2:将令牌放在请求头中(需与后端配置的HeaderName一致)
curl -b cookies.txt -X POST https://localhost:7084/data \ -H "X-CSRF-TOKEN: TOKEN_VALUE" \ -d "key=valueFromCurl"
三、重要提醒
不要随意禁用防伪造验证,这是防止CSRF攻击的核心安全机制,仅在公开无敏感数据的API场景下可考虑跳过。
内容的提问来源于stack exchange,提问作者Boyfinn
相关产品推荐
相关产品推荐

