在我的后端,我实现了一个IpRateLimit中间件与AspNetCoreRateLimit包在我的.net核心实体框架后端。当一个IP地址x在特定的时间内进行y次调用时,它会被阻塞一段时间,后端应该返回一个429错误,这在使用postman测试时工作正常。但是,当我用axios发出请求时,由于ip速率限制器,应该会被阻止,我收到一个axios错误:
"Access to XMLHttpRequest at 'https://localhost:44372/api/Users/Login/' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource."
"POST https://localhost:44372/api/Users/Login/ net::ERR_FAILED"
收到这个错误后,我添加了所需的头,但它并没有改变结果。其他axios请求到我的后端(也发布,放置和删除)工作正常,但当ip速率限制器命中,我只是得到cors错误。
我在我的应用程序中实现了限制器,如以下教程所示:https://edi.wang/post/2019/6/16/ip-rate-limit-for-aspnet-core
React axios请求:
async function buildPostAndFetch(url, param, header) {
const finalurl = `${BASE_URL}${url}`;
return axios.post(finalurl, param, {headers:{"Access-Control-Allow-Origin": "*"}})
.then(res => {
response(res);
return res.data ? res.data : true;
})
.catch(err => {
handleError(err);
return false;
})
}
handleError() {
const handleError = err => {
setError(true);
if(err.request?.status === 0) {
console.log("*********************************************")
console.log(err.request);
console.log("*********************************************")
// throw new Error("API is currently offline or you are not connected to the internet:(");
} else if(err.response.status === 429) {
console.log("*********************************************")
console.log(err.response);
console.log("*********************************************")
}
}
}
当请求和限制器命中时,我总是进入err.request.status = 0路径。
4条答案
按热度按时间7ajki6be1#
默认情况下,大多数服务器系统/运行时不会将application-set header添加到
4xx
和5xx
响应中,而是只将它们添加到2xx
成功响应中,可能还添加到3xx
重定向中。因此,您可能需要进行显式配置以强制将头添加到4xx响应中,以便
429
响应最终使用Access-Control-Allow-Origin
头。例如,在Apache和nginx中,这是通过将
always
关键字添加到header-setting指令来完成的。也许你的服务器系统也有类似的东西。您会得到一个CORS错误,因为该
429
错误没有Access-Control-Allow-Origin
标头。bvhaajcl2#
首先,确保您有来自NuGet的
Install-Package Microsoft.AspNetCore.Cors
。然后,请将以下内容添加到您的
Startup.cs
完成上述配置后,通过检查您的网络选项卡(浏览器的开发人员工具),您可能会看到返回的响应头之一是
access-control-allow-origin : http://localhost:3000
。kmynzznz3#
也犯了同样的错误。在我的情况下,问题是在错误的顺序,我的中间件组件在
Startup.Configure
管道。我的RateLimit
中间件被放在UseCors
组件之前,所以它在到达cors
中间件之前被短路了。因此,没有响应cors标头。正确的年龄应该是:
pu3pd22g4#
试试看:
协议(http/https)不能省略。另外,cors中间件应该放在
app.UseRouting
之后,UseAuthorization
之前。你可以看到中间件订单。