Angular cors 问题:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态

问题描述

我有一个 Angular 8 应用程序,它向 IIS 服务器上托管的 Flask REST API 发出 POST 请求(使用 Windows 身份验证)。问题是每次我从我的角度代码执行 POST 请求时,我都会收到 CORS 错误

Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

当我直接从浏览器直接调用它们时,api 工作正常,问题是当我从我的 angular 项目中调用它们时。

我使用过flask-CORS库:

cors = CORS(app,resources={r"/*": {"origins": "*"}})

@app.route('/',methods=['GET','POST'])
@cross_origin(origin='*',headers=['Content-Type','Authorization'],supports_credentials=True)
def home(): 
    """
    Returns template for Home page .
    """
    return "<h1>Home Page</h1>"

我在 IIS 服务器中设置了这些 HTTP 响应标头:

Access-Control-Allow-Headers: Origin,Content-Type,X-Auth-Token
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS

当我检查网络选项卡时,我收到 CORS 错误而不是状态 401,因此我认为该错误不是身份验证问题。

我遇到了多个 stackoverflow 问题,但所有这些问题都涉及 ASP.net,少数涉及烧瓶的问题,他们都提到在 IIS 服务器中设置标题,但我的问题仍未解决

请指导我...

编辑

这是我的响应头:

Provisional headers are shown
Accept: application/json,text/plain,*/*
content-type: application/json

解决方法

当您发出 POST 请求时,浏览器会自动发出预检 OPTIONS 请求。 OPTIONS 请求的目的是验证您是否有权发出 POST 请求。

您的问题有两种解决方案:

(1) 在您的服务器上设置 COR 标头以允许来自其他域的请求 (2) 将您的服务器设置为代理请求 - 这会绕过浏览器,并且由于只有浏览器强制执行 CORS,您的服务器上不再需要 CORS 标头。

方法 (1) 您可以在浏览器的网络选项卡上测试 COR 标头是否按预期通过。可能,您还需要支持 OPTIONS 预检方法。

方法 (2) 更安全,但工作量更大,因为您还需要在您的生产服务器上进行设置(如果您有)。

这里有一篇关于 Angular 代理的文章... https://medium.com/bb-tutorials-and-thoughts/angular-how-to-proxy-to-backend-server-6fb37ef0d025 ... 但我相信还有更好的文章,搜索一下吧!

一切顺利:)

,

所以我终于解决了!

此链接中的答案表明我们需要使用新的 OPTIONS 请求规则更新 Web 配置文件。

CORS preflight request returning HTTP 401 with windows authentication

要使用上述 sol,您必须在 IIS 服务器上为 Web 平台安装程序(也必须下载)下载url rewrite

请记住,只应启用 Windows 身份验证(同时单击 Windows 身份验证选项,然后单击高级设置,将 NTLM 推到列表顶部)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...