You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET5 MVC升级至.NET7 MVC引发内容安全策略错误

问题解决:.NET7 MVC项目跳转时CSP拦截WebSocket连接错误

解决方案

方案1:关闭开发环境热重载

热重载脚本aspnetcore-browser-refresh.js是触发该错误的核心原因,在开发环境临时关闭热重载即可解决:
修改项目根目录下Properties/launchSettings.json,在对应配置中添加hotReloadEnabled: false:

"profiles": {
  "YourMvcProject": {
    "commandName": "Project",
    "dotnetRunMessages": true,
    "launchBrowser": true,
    "applicationUrl": "https://localhost:5001;http://localhost:5000",
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development"
    },
    "hotReloadEnabled": false
  }
}

方案2:正确配置CSP允许热重载WebSocket连接

若需保留热重载,需通过HeaderPolicyMiddleware针对性配置开发环境的CSP规则,确保中间件顺序正确:

  1. 先安装Microsoft.AspNetCore.HeaderPolicy NuGet包
  2. 在Program.cs中按如下顺序配置:
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();
builder.Services.AddHeaderPolicy(options =>
{
    if (builder.Environment.IsDevelopment())
    {
        options.AddContentSecurityPolicy(builder =>
        {
            builder.DefaultSources(s => s.Self())
                   .ConnectSources(s => s.Self()
                       .CustomSources("wss://localhost:44375")); // 替换为AuthServer的WebSocket端口
        });
    }
    else
    {
        // 生产环境严格CSP配置
        options.AddContentSecurityPolicy(builder =>
        {
            builder.DefaultSources(s => s.Self());
        });
    }
});

var app = builder.Build();

// 注意:HeaderPolicy中间件必须放在UseRouting之前
app.UseHeaderPolicy();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

原因分析

该问题并非.NET7特性,而是开发环境热重载逻辑的变化:

  • .NET5中热重载的WebSocket连接未触发严格的CSP检查;
  • .NET7配合高版本Visual Studio时,热重载脚本会尝试建立WebSocket连接到关联服务(如你的AuthServer),但默认CSP规则仅允许self来源,导致连接被拦截。
  • 你之前尝试的中间件方案无效,是因为中间件顺序错误,未优先于路由、静态文件等中间件执行,导致CSP头被覆盖或未生效。

验证方法

  • 确认开发/生产环境的CSP配置隔离,生产环境无需考虑热重载的WebSocket规则;
  • 核对两个项目launchSettings.json中的端口,确保WebSocket连接地址与AuthServer的实际端口一致。

内容的提问来源于stack exchange,提问作者L_Karapetti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:43:45