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

ASP.NET Core 3.1站点指定目录静态资源访问302跳转至登录页问题

问题原因

  1. 核心原因是Startup.cs中中间件执行顺序错误:自定义的/samadhi路径静态文件中间件配置放在了UseAuthentication、UseAuthorization认证授权中间件之后,所有访问/samadhi路径下静态资源的请求,都会先经过认证校验,未登录状态下就会触发Cookie认证的302跳转到登录页的逻辑。
  2. 同属/samadhi根路径的其他目录资源可正常访问,大概率是这些资源之前有浏览器缓存、或是之前版本代码中静态文件中间件顺序正确时访问过,未触发认证跳转逻辑。
  3. ModSecurity日志中的告警属于规则920300的Accept头缺失提示,是干扰项,不是触发302的根因。
  4. 符合「初期部署正常、数周前突发」的特征:大概率是某次代码发布时误调整了Configure方法里中间件的排列顺序,导致自定义静态文件中间件被移到了认证授权中间件之后。

解决方法

  1. 调整Startup.cs的Configure方法中中间件的顺序,把自定义的两个静态文件中间件移到认证授权相关中间件之前,调整后顺序参考:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    try
    {
        // set file path
        gFunc.SetLogFilePaths(Directory.GetCurrentDirectory());

        // environment
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        // 默认静态文件中间件(处理wwwroot目录)
        app.UseStaticFiles();

        // 移动自定义静态文件中间件到认证逻辑之前
        var provider = new FileExtensionContentTypeProvider();
        provider.Mappings.Add(".exe", "application/octect-stream");
        app.UseStaticFiles(new StaticFileOptions
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "canvas")),
            RequestPath = "/canvas",
            ServeUnknownFileTypes = true,
            DefaultContentType = "plain/text",
            ContentTypeProvider = provider
        });

        provider = new FileExtensionContentTypeProvider();
        provider.Mappings.Add(".exe", "application/octect-stream");
        app.UseStaticFiles(new StaticFileOptions
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "samadhi")),
            RequestPath = "/samadhi",
            ServeUnknownFileTypes = true,
            DefaultContentType = "plain/text",
            ContentTypeProvider = provider
        });

        app.UseRouting();
        // 认证授权中间件放在静态文件逻辑之后
        app.UseAuthentication();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
    catch (Exception ex)
    {
        gFunc.ProcessError(ex);
    }
}
  1. 补充检查:确认是否存在路由规则和/samadhi/staff路径重合的控制器/接口,比如存在加了[Authorize]属性的StaffController或者SamadhiController下的Staff Action,如果存在需要调整路由避免和静态文件路径冲突。
  2. 调整后重新发布站点,清理浏览器缓存后测试即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:48:03