【发布时间】:2020-09-11 18:44:48
【问题描述】:
技术栈如下
- .Net core WebApi (C#)
- MarkLogic 9.0.8.2
我们开发了带有基本身份验证的 MarkLogic API,当从 C# WebApi 调用它时,我们在标头中传递凭据。
我们注意到 MarkLogic 访问日志有 2 个条目,即
- xx.xxx.xxx.xx - - [18/May/2020:06:05:35 +0000] "GET /getcontent?query=test&offset=1&size=10&format=Extended&sortOrder=ASC&transform=&IncludeFacet=true HTTP/1.1" 401 209 - -
- xx.xxx.xxx.xx - MLUser [18/May/2020:06:05:35 +0000] "GET /getcontent?query=test&offset=1&size=10&format=Extended&sortOrder=ASC&transform =&IncludeFacet=true HTTP/1.1" 200 44229 - -
同样的请求带有 401 即未经授权,然后立即带有 200 即成功。
我们意识到从 C# WebAPI 调用 API 端点是在调用实际请求之前使用 OPTIONS 执行预检请求。
我们发现有发送内容类型为“文本/纯文本”的选项来解决这个问题,但我们不能,因为我们有 JSON 对象,然后我们需要做更多的事情来将文本解析为 JSON 对象。
当我们从 PostMan 调用时,我们面临同样的问题。
因此,当我们在 API 上收到大量请求时,ML API 在防火墙上返回 401 错误,然后 FW 会阻止所有请求,将其视为暴力攻击。
有什么方法可以禁用预检请求调用?
MarkLogicHttpClient _client;
var queryParams = new Dictionary<string, string>
{
{ "query", searchRequest.Query },
{ "offset", searchRequest.Offset.ToString() },
{ "size", searchRequest.Size.ToString() },
{ "format", searchRequest.Format },
{ "sortOrder", searchRequest.SortOrder.ToString().ToUpper() },
{ "transform", transform }
};
var searchUri = QueryHelpers.AddQueryString("getcontent", queryParams);
var response = await _client.GetAsync(searchUri);
//Startup.cs
services.AddHttpClient<IMarkLogicClient, MarkLogicHttpClient>(client =>
{
client.BaseAddress = MarkLogicEndpoint;
})
.ConfigurePrimaryHttpMessageHandler(() =>
new HttpClientHandler
{
Credentials = new NetworkCredential
{
UserName = UserName,
Password = Password
}
}
);
【问题讨论】:
-
如何将凭据添加到标头?可以提供代码吗?
-
您好布伦特,感谢您的回复。我在问题本身中添加了代码。
标签: c# marklogic http-status-code-401 webapi preflight