axios 当达到速率限制时,获得CORS错误而不是预期的429响应

hmae6n7t  于 2023-10-18  发布在  iOS
关注(0)|答案(4)|浏览(212)

在我的后端,我实现了一个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路径。

7ajki6be

7ajki6be1#

默认情况下,大多数服务器系统/运行时不会将application-set header添加到4xx5xx响应中,而是只将它们添加到2xx成功响应中,可能还添加到3xx重定向中。
因此,您可能需要进行显式配置以强制将头添加到4xx响应中,以便429响应最终使用Access-Control-Allow-Origin头。
例如,在Apache和nginx中,这是通过将always关键字添加到header-setting指令来完成的。也许你的服务器系统也有类似的东西。
您会得到一个CORS错误,因为该429错误没有Access-Control-Allow-Origin标头。

bvhaajcl

bvhaajcl2#

首先,确保您有来自NuGet的Install-Package Microsoft.AspNetCore.Cors
然后,请将以下内容添加到您的Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    // Put it before AddMvc() if there's any
    services.AddCors();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // Put it before UseMvc() if there's any
    app.UseCors(
        options => options
            .WithOrigins("http://localhost:3000")
            .AllowAnyHeader()
            .AllowAnyMethod()
    );

    app.UseMvc();
}

完成上述配置后,通过检查您的网络选项卡(浏览器的开发人员工具),您可能会看到返回的响应头之一是access-control-allow-origin : http://localhost:3000

kmynzznz

kmynzznz3#

也犯了同样的错误。在我的情况下,问题是在错误的顺序,我的中间件组件在Startup.Configure管道。我的RateLimit中间件被放在UseCors组件之前,所以它在到达cors中间件之前被短路了。因此,没有响应cors标头。
正确的年龄应该是:

public void Configure(WebApplication app, IWebHostEnvironment env)
        {

            //.... other middleware

            app.UseRouting();

            //....

            app.UseCors("YourPolicyName");
            app.UseMiddleware<RequestRateLimitMiddleware>();

            //....
            app.UseAuthentication();
            app.UseAuthorization();

            //....
        }
pu3pd22g

pu3pd22g4#

试试看:

app.UseCors(opt => opt
    .WithOrigins("http://localhost:3000"")
    .AllowAnyHeader()
    .AllowAnyMethod());

协议(http/https)不能省略。另外,cors中间件应该放在app.UseRouting之后,UseAuthorization之前。
你可以看到中间件订单。

相关问题