首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ASP.NET Core3.1发布CORS源问题

使用ASP.NET Core3.1发布CORS源问题
EN

Stack Overflow用户
提问于 2022-08-31 03:44:08
回答 1查看 103关注 0票数 0

在使用C# ASP.NET Core3.1和GraphQL (Version="3.3.2")时,我遇到了一个奇怪的CORS问题。在Startup.cs文件中,我设置了如下UseCors:

代码语言:javascript
运行
复制
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    if (Environment.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseCors (x => x
                .AllowAnyOrigin ()
                .AllowAnyMethod ()
                .AllowAnyHeader ());
            ...
}

并创建一个ConfigureCors函数,如下所示:

代码语言:javascript
运行
复制
private void ConfigureCors(IServiceCollection services)
{
    var requestOrigins = Configuration.GetSection("RequestOrigins")?
                .GetChildren()
                .Select(url => url.Value)
                .ToArray() ?? new string[] {};
            
    services.AddCors(options =>
            {
                options.AddPolicy(name: AllowSpecificOrigins,
                    builder =>
                    {
                        builder.WithOrigins(requestOrigins)
                            .AllowAnyHeader()
                            .AllowCredentials()
                            .AllowAnyMethod();
                    });
            });
}

ConfigureCors是这样命名的:

代码语言:javascript
运行
复制
public void ConfigureServices(IServiceCollection services)
{
         ConfigureCors(services);
         ...
}

appsetting.{env}.json中,我设置了RequestOrigins

代码语言:javascript
运行
复制
"RequestOrigins": [
    "http://localhost:8889"
  ]

当使用前端时,请按这样的方式对突变进行响应:

代码语言:javascript
运行
复制
const link = new HttpLink({
  uri: 'https://localhost:5001/graphql/v1',
  fetchOptions: {
    credentials: 'include'
  },
  headers : {Authorization: `Bearer ${localStorage.getItem('Token')}`}
})

export default new ApolloClient({
  link,
  cache
});

它将抛出CORS问题:

CORS策略阻止了从源“https://localhost:5001/graphql/v1”获取“http://localhost:8889”的访问:对飞行前请求的响应没有通过访问控制检查:当请求的凭据模式为“包括”时,响应中的“访问控制-允许-原产地”标题的值不能是通配符“*”。

但是,后端日志显示:

信息: Microsoft.AspNetCore.Hosting.Diagnostics1 请求启动HTTP/1.1选项https://localhost:5001/graphql/v1 信息: Microsoft.AspNetCore.Cors.Infrastructure.CorsService4 CORS策略执行成功。

我很困惑:

  1. 为什么OPTIONS不是POST,因为我称之为graphql突变?
  2. 为什么后端显示CORS策略执行成功,而前端有CORS阻止程序?

但是,如果我像这样注释掉身份验证部分:

代码语言:javascript
运行
复制
const link = new HttpLink({
      uri: 'https://localhost:5001/graphql/v1',
      //fetchOptions: {
        //credentials: 'include'
      //},
      //headers : {Authorization: `Bearer ${localStorage.getItem('Token')}`}
    })

获得授权失败错误,但没有CORS阻止程序。我在邮递员中验证过的标记。如果我移除app.UseCors,CORS阻滞剂就会回来,这是可以理解的。我猜是一些CORS相关的配置我做得不对,但不确定哪一部分,谁知道是怎么回事?非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2022-08-31 07:42:03

基于此链接中的Microsoft,当您添加新策略时,需要将该策略指定给app.UseCors()。也要注意这一点

对UseCors的调用必须放在UseRouting之后,而在UseAuthorization之前。有关更多信息,请参见中间件订单。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73550649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档