当服务器返回 401 响应时,请求的资源上不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】当服务器返回 401 响应时,请求的资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:No 'Access-Control-Allow-Origin' header is present on the requested resource when 401 response is returned from the server 【发布时间】:2020-03-08 05:15:41 【问题描述】:

我有一个 .NET Core 3.0 和 Angular 8 Web 应用程序。我在 Startup.cs 中启用了 CORS,它工作正常。我正在使用 JWT 身份验证以及角度侧的拦截器将 JWT 令牌附加到每个请求。当令牌有效时,对具有[Authorize] 属性的路由的调用成功。当令牌过期/无效时,服务器按预期返回 401。但是,角度拦截器无法识别 401 错误,因为控制台错误中存在 CORS 问题:

访问 XMLHttpRequest 在 'https://localhost:5001/api/Users/test' 来自原点 'http://localhost:4200' 已被 CORS 策略阻止:否 请求中存在“Access-Control-Allow-Origin”标头 资源。

在检查响应时,我可以看到响应中没有 Access-Control-Allow-Origin 标头。为什么会这样?请注意,如果令牌有效,则不会发生这种情况。

Startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
    

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthentication();

    app.UseAuthorization();

    app.UseCors(builder => builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader());

    app.UseEndpoints(endpoints =>
    
        endpoints.MapControllers();
    );

Angular 收到错误状态为status: 0, statusText: "Unknown Error"

【问题讨论】:

为什么会这样? Because CORS Why does my javascript code get a "No 'Access-Control-Allow-Origin' header is present on the requested resource" error when Postman does not?的可能重复 @Liam 我已经提到 CORS 已启用并在 JWT 令牌有效时工作。 【参考方案1】:

UseCors 应放在UseAuthenticationUseAuthorization 上方:

app.UseCors(builder => builder
    .AllowAnyOrigin()
    .AllowAnyMethod()
    .AllowAnyHeader());

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

否则,当授权中间件使管道短路时,CORS 中间件将不会运行,因此不会添加 CORS 标头。这一点在 ASP.NET Core 3.0 中与 UseAuthorization 的引入略有不同,但中间件的顺序一直很重要。

【讨论】:

以上是关于当服务器返回 401 响应时,请求的资源上不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

当 HTTP 请求返回状态 401 时,如何在 Java 中解析响应正文

从 http 网页请求本地资源时响应为 401 错误

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

Angular2:http.get 返回“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”

请求的资源上不存在“Access-Control-Allow-Origin”标头。或 对预检请求的响应未通过访问控制检查

AWS - 对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头