反应js请求和jwt的cors问题

Posted

技术标签:

【中文标题】反应js请求和jwt的cors问题【英文标题】:cors problem with react js request and jwt 【发布时间】:2020-11-30 20:18:18 【问题描述】:

我正在尝试从 asp.net core 3.1 获取数据,因此我使用请求登录并获取 jwt 令牌。之后我想发送一个从 api 获取数据的请求,但它导致“预检请求”从源 'http://localhost:3000' 获取在 'https://localhost:44328/Address' 的访问已被阻止CORS 策略:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。 apiAddress.js:24 GET https://localhost:44328/Address net::ERR_FAILED",我使用 Visual Studio localhost 作为 api 服务器并配置启动如下:

     //in ConfigureServices
        services.AddCors(options =>
        
            options.AddPolicy(name: AllowedOrigins,
                              builder =>
                              
                                  builder
                                        .AllowAnyOrigin()
                                        .AllowAnyMethod()
                                        .AllowAnyHeader()
                                        .SetIsOriginAllowed(hostName => true);

                              );
        );
//in configure
    app.UseCors(AllowedOrigins);

我的 fetch 请求在 reactjs 中如下所示:

    const response = await fetch(url, 
        'method': 'GET',
        'mode': 'cors',
        'credentials': 'include',
        'headers': 
            'Content-Type': 'application/json; charset=utf-8;',
            //'Content-Type':'application/x-www-form-urlencoded',
            'Authorization':`bearer $token`
        
    );

最后我的控制器如下所示:

[ApiController, EnableCors("AllowedOrigins"), Authorize,  Route("[controller]")]
public class AddressController : ControllerBase

出了什么问题,我必须提到没有 [Authorize] 属性的其他操作可以正常工作,但是带有它的操作不起作用?! 有人提到我应该在 iis 中启用选项,但没有解释如何?

【问题讨论】:

你的网址在package.json的代理中,还是你把它写成一个字符串在ajax帖子里? 'Authorization':bearer $token`` 这会触发 CORS 预检。我们可以在不触发 CORS 的情况下使用的标头和值非常具体。(Authorization 不是其中之一) 我把它写成变量中的字符串 那我该怎么办 【参考方案1】:

您可能需要在 IIS 上启用 CORS。以下是操作步骤。

    打开 Internet 信息服务 (IIS) 管理器。 右键单击要为其启用 CORS 的站点,然后转到“属性”。 切换到 HTTP 标头选项卡。 在“自定义 HTTP 标头”部分中,单击“添加”。 输入 Access-Control-Allow-Origin 作为标题名称。 输入 * 作为标题值。 点击确定两次。

【讨论】:

我正在使用本地主机和其他操作正常,除了带有授权过滤器的操作,这对您的答案有什么影响吗?想 访问从源 'localhost:3000' 获取在 'localhost:44328/Address' 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:否 'Access-Control-Allow -Origin' 标头存在于请求的资源上。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。 apiAddress.js:24 GET localhost:44328/Address net::ERR_FAILED【参考方案2】:

对预检请求的响应未通过访问控制检查:....

没有 [Authorize] 属性的其他操作可以正常工作,但带有它的操作不起作用

在this doc,你会发现:

CORS 预检请求用于确定所请求的资源是否设置为由服务器跨源共享。并且 OPTIONS 请求始终是匿名的,如果未启用匿名身份验证,服务器将无法正确响应预检请求。

在 IIS 服务器上托管时,您可以尝试安装 IIS CORS module 并配置站点/应用程序以使其正常运行。

此外,如果您想通过 IIS express 使其在本地工作,为了在 CORS 上进行测试,您可以尝试允许匿名访问。

或者使用 kestrel 运行它并编写自定义中间件以正确响应预检请求。

【讨论】:

以上是关于反应js请求和jwt的cors问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 CORS 的 GraphQL 请求的无效响应和通过使用 JWT 的 GraphiQL 处理身份验证的有效响应

CORS 错误仅与 400 错误请求反应获取请求

Safari不会在Apache上的Vue.js应用程序中加载预检CORS身份验证请求(XHR)

OPTIONS 请求的 CORS 问题

在 Django 中使用 Axios 和 CORS 获取 POST 请求的错误请求并做出反应

CakePHP2:JWT Auth 的 CORS 预检问题