如何在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
相关产品推荐
相关产品推荐

