Cors策略问题Blazor WASM、Web API和Identity Server 4和IIS

Cors策略问题Blazor WASM、Web API和Identity Server 4和IIS,cors,identityserver4,blazor,webapi,Cors,Identityserver4,Blazor,Webapi,我在尝试从我的WASM blazor应用程序向web api发送POST请求时遇到Cors策略错误 在'http://localhost:8080/DashboardService/TestConnection“起源”https://localhost:8081'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origin'标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源 我在调试模式下没有问题,只有IIS发布

我在尝试从我的WASM blazor应用程序向web api发送POST请求时遇到Cors策略错误

在'http://localhost:8080/DashboardService/TestConnection“起源”https://localhost:8081'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origin'标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源

我在调试模式下没有问题,只有IIS发布

Startup.cs(WEB API)

公共类启动
{
#区域字段/属性
私有静态只读NLog.Logger Logger=NLog.LogManager.GetCurrentClassLogger();
专用只读IConfiguration配置;
#endregion字段/属性
#区域构造函数
/// 
///初始化类的新实例。
/// 
///配置标识符
公共启动(IConfiguration配置)
{
Trace($“{GetType().FullName}构造”);
this.configuration=配置;
}
#端域构造函数
#区域方法
/// 
///此方法由运行时调用。请使用此方法将服务添加到容器中。
/// 
///服务集合标识符
public void配置服务(IServiceCollection服务)
{
//统计和监测处
services.AddSingleton();
services.AddSingleton();
services.AddCors(选项=>
{
options.AddPolicy(“CorsPolicy”,
生成器=>
{
建设者
.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
services.AddCors(options=>options.AddPolicy(“CorsPolicy2”),
生成器=>
{
建筑商。来源(“https://localhost:8081)。AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
}));
services.addSignaler(选项=>
{
options.EnableDetailedErrors=true;
options.MaximumReceiveMessageSize=long.MaxValue;
options.ClientTimeoutInterval=TimeSpan.FromSeconds(240);
options.KeepAliveInterval=TimeSpan.FromSeconds(120);
})
字符串标识服务器权限=”https://localhost:8082";
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,opt=>
{
opt.requirehttpsmatadata=false;
opt.Authority=identityServerAuthority;
opt.academy=“backend”;
});
logger.Trace($“已配置服务”);
}
/// 
///此方法由运行时调用。请使用此方法配置HTTP请求管道。
/// 
///应用程序生成器标识符
///web主机环境标识符
///代理服务标识符
///CollectedValueConverter标识符
///DatabaseConnectionService标识符
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Style”,“IDE0060:删除未使用的参数”,Justification=“依赖注入仅强制单例实例化”)]
public void Configure(IApplicationBuilder应用程序、IWebHostEnvironment环境、IDatabase服务应用程序配置数据库服务应用程序配置、IAgentsService代理服务、IMachineStructureService机器结构服务、ICollectedValueConverter collectedValueConverter、IDatabase连接服务数据库连接服务)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
//app.UseHsts();
}
//app.UseHttpsRedirection();
app.UseRouting();
附录UseCors(“CorsPolicy2”);
app.UseAuthentication();
app.UseAuthorization();
app.UseStaticFiles();
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
endpoints.MapHub(“/DashboardService”);
});
}
#端域法
}
我在我的控制器上有[授权]属性,如果我删除它们,它会工作

有人能帮我吗?提前谢谢


Rihen我看到的第一个问题是这两行的顺序不对:

 app.UseAuthorization();
 app.UseAuthentication();
您应该始终在授权之前进行身份验证

您还应该知道,在IdentityService客户端定义中有单独的CORS设置,但这些(如果我没有错的话)仅在调用IdentityServer端点时应用。

问题已解决: 我转到windows中的事件查看器,看到了真正的错误,这是一个SSL证书问题。我的后端是http,identity server不接受这种方式。 我们将后端转换为https并使用开发证书。 我们面临同样的问题,但这一次是个人存储的证书,不受信任。管理此问题的步骤包括: Windows->Run->mmc.exe-->证书-->此计算机-->本地-->复制受信任的本地主机证书


谢谢大家的帮助。

哦,是的,谢谢,但我在当前版本中更改了它。忘了在这里编辑,但仍然无法工作@如果您在wasm应用程序中使用
HttpClient
时发布整个启动类,尝试添加
message.SetBrowserRequestMode(BrowserRequestMode.Cors),Tore Nestenius更新我的回答可能会有所帮助发送到您的
HttpRequestMessage
。您需要在IIS上以https发布api,并在中创建SSLIIS@HMZ我尝试了两种解决方案,但仍然出现cors策略错误。我不明白的是,它与控制器上的[Authorize]属性有关。它在集成IS4之前就已经工作了。谢谢你的帮助@墨水
 app.UseAuthorization();
 app.UseAuthentication();