在使用C# ASP.NET Core3.1和GraphQL (Version="3.3.2")时,我遇到了一个奇怪的CORS问题。在Startup.cs
文件中,我设置了如下UseCors:
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors (x => x
.AllowAnyOrigin ()
.AllowAnyMethod ()
.AllowAnyHeader ());
...
}
并创建一个ConfigureCors
函数,如下所示:
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
是这样命名的:
public void ConfigureServices(IServiceCollection services)
{
ConfigureCors(services);
...
}
在appsetting.{env}.json
中,我设置了RequestOrigins
"RequestOrigins": [
"http://localhost:8889"
]
当使用前端时,请按这样的方式对突变进行响应:
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策略执行成功。
我很困惑:
OPTIONS
不是POST
,因为我称之为graphql突变?但是,如果我像这样注释掉身份验证部分:
const link = new HttpLink({
uri: 'https://localhost:5001/graphql/v1',
//fetchOptions: {
//credentials: 'include'
//},
//headers : {Authorization: `Bearer ${localStorage.getItem('Token')}`}
})
获得授权失败错误,但没有CORS阻止程序。我在邮递员中验证过的标记。如果我移除app.UseCors
,CORS阻滞剂就会回来,这是可以理解的。我猜是一些CORS相关的配置我做得不对,但不确定哪一部分,谁知道是怎么回事?非常感谢!
发布于 2022-08-31 07:42:03
基于此链接中的Microsoft,当您添加新策略时,需要将该策略指定给app.UseCors()。也要注意这一点
对UseCors的调用必须放在UseRouting之后,而在UseAuthorization之前。有关更多信息,请参见中间件订单。
https://stackoverflow.com/questions/73550649
复制相似问题