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

如何在ASP.NET Core 6托管的React应用中强制授权?

解决ASP.NET Core 6 + React应用强制全局SSO认证问题

核心问题分析

你当前的配置仅对控制器路由生效,原因在于React应用的静态文件(如JS、CSS)和SPA fallback路由(index.html)未被纳入授权校验范围,同时中间件顺序设置不当,导致静态文件请求在触发认证逻辑前就已返回。

具体解决方案

1. 调整中间件顺序并修复认证判断逻辑

将自定义认证中间件移至UseAuthentication之后、UseStaticFiles和MapFallbackToFile之前,简化认证判断逻辑,并排除SSO回调等无需认证的路径,避免循环:

app.UseAuthentication();
app.UseAuthorization();

// 自定义强制认证中间件,需放在静态文件处理前
app.Use(async (context, next) =>
{
    // 排除SSO回调、图标等无需认证的路径,可根据需求扩展
    var skipPaths = new[] { "/signin-oidc", "/signout-callback-oidc", "/favicon.ico" };
    if (skipPaths.Any(path => context.Request.Path.StartsWithSegments(path)))
    {
        await next();
        return;
    }

    // 简化认证状态判断
    if (!context.User.Identity?.IsAuthenticated ?? true)
    {
        await context.ChallengeAsync();
        return;
    }

    context.Response.Headers.Add("Content-Security-Policy", "default-src 'self';");
    await next();
});

// 静态文件处理(确保在认证中间件之后)
app.UseStaticFiles();

// 给SPA fallback路由添加授权约束
app.MapFallbackToFile("index.html")
   .RequireAuthorization();

2. 完善OpenIdConnect配置(必选)

你当前的认证配置仅初始化了Cookie认证,缺少企业SSO的OpenIdConnect核心配置,示例如下:

builder.Services.AddAuthentication(sharedOptions =>
{
    sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    // 替换为你的企业SSO实际参数
    options.Authority = "https://your-company-sso.com";
    options.ClientId = "your-client-id";
    options.ClientSecret = "your-client-secret";
    options.ResponseType = "code";
    options.SaveTokens = true;
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    // 其他SSO相关配置(如回调路径、登出配置等)
});

关键注意事项

  • 中间件顺序:ASP.NET Core按注册顺序执行中间件,必须保证认证校验逻辑在静态文件、SPA路由处理前运行,否则请求会直接返回静态资源,跳过认证。
  • 避免循环认证:必须排除SSO回调路径,否则请求回调时会被强制触发认证,导致无限循环跳转。
  • SPA路由全覆盖:MapFallbackToFile("index.html")是所有React前端路由的入口,给它添加RequireAuthorization()即可覆盖所有前端页面的访问校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:20:03