反应js请求和jwt的Cors问题

时间:2020-08-11 07:34:49

标签: reactjs asp.net-core cors preflight

我正在尝试从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);

我的提取请求类似于以下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中启用选项,但没有说明如何?

2 个答案:

答案 0 :(得分:0)

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

  1. 打开Internet信息服务(IIS)管理器。
  2. 右键单击要启用CORS的站点,然后转到“属性”。
  3. 更改为“ HTTP标头”标签。
  4. 在“自定义HTTP标头”部分中,单击“添加”。
  5. 输入Access-Control-Allow-Origin作为标题名称。
  6. 输入*作为标题值。
  7. 单击确定两次。

答案 1 :(得分:0)

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

没有[Authorize]属性的其他操作正常,但没有作用

this doc中,您将找到:

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

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

此外,如果您想使其与IIS Express一起在本地运行,出于对CORS进行测试的目的,您可以尝试允许匿名访问。

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