401 未经授权响应 CORS 预检选项请求

Posted

技术标签:

【中文标题】401 未经授权响应 CORS 预检选项请求【英文标题】:401 Unauthorized response to CORS preflight OPTIONS request 【发布时间】:2020-07-23 09:10:06 【问题描述】:

我在 ASP.NET CORE 中的 WebApi 出现 CORS 问题,当我向客户端发出 HTTP GET 请求时,我出现以下错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://service.staging.domain.com/application-api-staging/account. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://service.staging.domain.com/application-api-staging/account. (Reason: CORS request did not succeed

https://service.staging.domain.com/application-api-staging 是我的 WebAPI 基础 https://client.staging.domain.com 我的网络客户端。

当我检查 Firefox 控制台时,我在下面有一个请求和响应标头:

响应标头

HTTP/1.1 401 Unauthorized
Server: nginx/1.10.3
Date: Fri, 10 Apr 2020 14:55:31 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 61
Connection: keep-alive
X-DNS-Prefetch-Control: off
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Download-Options: noopen
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
ETag: W/"3d-nALmWVEo7YlT78MufcqgeUavvX4"

请求标头

Host: service.staging.domain.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0
Accept: */*
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization,content-type,tenant
Referer: https://client.staging.domain.com/application/
Origin: https://client.staging.domain.com
Connection: keep-alive

在我的 webAPI startup.cs 中,我配置了 CORS: 启动.cs

readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";

services.AddCors(options => 
  options.AddPolicy(MyAllowSpecificOrigins,
    builder => 
      builder
       .AllowAnyOrigin()
       .AllowAnyHeader()
       .AllowAnyMethod();
    );
);

app.UseCors(MyAllowSpecificOrigins)

在我的控制器中。

accountController.cs

[EnableCors("_myAllowSpecificOrigins")]

当我在本地使用客户端 Web 和 WebAPI 进行测试时, 客户端网络 -> http://localhost:4200 WebApi -> https://localhost:44354 在这种情况下,我可以提出请求,没问题......它可以工作

但在第二种情况下: 客户端网络 -> http://localhost:4200 WebApi -> https://service.staging.domain.com/application-api-staging 在这种情况下,我遇到了 CORS 问题,无法正常工作

在第三种情况下与 Web 客户端和 WebApi 部署相同 客户端网页 -> https://client.staging.domain.com/application/ WebApi -> https://service.staging.domain.com/application-api-staging 同样,我有一个 CORS 问题,无法正常工作

在我的问题的开头看到相同的错误以获取错误消息。

为什么我的 url staging 出现错误 CORS?和/或我可以解决这个问题? 它是一个nginx问题吗?

感谢您的帮助。

更新

WebAPI 和 Webclient 在 Linux 服务器上工作,所以我不使用 IIS,但我使用 NGINX。

我如何配置 NGINX,或者可能是 asp.net 核心配置的问题?

【问题讨论】:

真正的问题是服务器响应预检 OPTIONS 请求时出现 401 Unauthorized 错误。您需要将该服务器配置为不需要对 OPTIONS 请求进行身份验证。换句话说,您不需要解决 CORS 问题——您需要解决 401 问题。 @sideshowbarker,感谢您的帮助,我可以解决 WebAPI 中的问题,或者是反向代理或其他问题? 【参考方案1】:

在 StartUp.cs 中检查您的中间件使用顺序 UseCors() 应该在 UseAthorization() 之前

【讨论】:

【参考方案2】:

试试这个,对我有用 在launchSettings.json的iisSettings下,将anonymousauthentication和windowsAuthentication设置为true。

"iisSettings": 
"windowsAuthentication": true,
"anonymousAuthentication": true,
"iisExpress": 
  "applicationUrl": "http://localhost:8791/",
  "sslPort": 0

【讨论】:

以上是关于401 未经授权响应 CORS 预检选项请求的主要内容,如果未能解决你的问题,请参考以下文章

删除和选项请求获得 401 未授权响应

Rails 在 CORS 预检选项请求中以 404 响应

预检响应具有无效的 HTTP 状态代码 401 - Spring

预检响应中不允许使用方法选项

CORS 选项预检悬挂

Yii2 和 reactjs CORS 过滤器给出错误:预检响应具有无效的 HTTP 状态代码 401