如何对需认证与防伪令牌验证的ASP.NET Core API端点做集成测试
ASP.NET Core API集成测试:搞定认证+防伪令牌的请求问题
解决步骤
要通过这个端点的测试,核心是先拿到认证Cookie和防伪令牌,再把两者都放进请求里发送,具体操作如下:
1. 初始化带Cookie支持的测试客户端
用WebApplicationFactory创建客户端时,确保允许自动重定向并启用Cookie管理:
var factory = new WebApplicationFactory<Program>(); var client = factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = true, BaseAddress = new Uri("https://localhost:5001/") });
2. 模拟登录获取认证Cookie
先调用登录接口完成认证,测试客户端会自动保存认证Cookie:
var loginContent = new FormUrlEncodedContent(new Dictionary<string, string> { ["Email"] = "test@example.com", ["Password"] = "Test123!" }); var loginResponse = await client.PostAsync("/Account/Login", loginContent); loginResponse.EnsureSuccessStatusCode();
3. 获取有效的防伪令牌
防伪令牌需要从当前会话中获取,你可以:
- 调用专门返回令牌的API接口:
var tokenResponse = await client.GetAsync("/api/AntiForgery/GetToken"); tokenResponse.EnsureSuccessStatusCode(); var tokenDto = await tokenResponse.Content.ReadFromJsonAsync<AntiForgeryTokenDto>(); var antiForgeryToken = tokenDto.Token;
- 或者如果是从页面表单获取,解析HTML提取
__RequestVerificationToken的值。
4. 构造目标请求,同时携带双验证信息
把防伪令牌放到请求头(要和你API配置的头名一致,比如RequestVerificationToken),客户端会自动带上之前保存的认证Cookie:
var requestData = new YourRequestDto { /* 你的请求数据 */ }; var requestContent = new StringContent( JsonSerializer.Serialize(requestData), Encoding.UTF8, "application/json" ); var targetRequest = new HttpRequestMessage(HttpMethod.Post, "/api/YourProtectedEndpoint") { Content = requestContent }; targetRequest.Headers.Add("RequestVerificationToken", antiForgeryToken); var response = await client.SendAsync(targetRequest); response.EnsureSuccessStatusCode(); // 现在应该能正常到达处理器了
必查配置点
确保你的API配置正确:
- 注册防伪服务时指定头名:
builder.Services.AddAntiforgery(opt => opt.HeaderName = "RequestVerificationToken"); - 目标端点同时标记
[Authorize]和[ValidateAntiForgeryToken]
避坑提醒
- 认证Cookie和防伪令牌必须来自同一个会话,不能分开获取后拼接
- 注意防伪令牌的传递方式(头/表单)要和API的验证逻辑匹配
- 测试客户端默认会自动管理Cookie,不要手动清空或替换
内容的提问来源于stack exchange,提问作者zwoolli
相关产品推荐
相关产品推荐

