ASP.NET Core IIS部署刷新页面时Session临时丢失修复
问题由两处配置错误共同导致:
Session Cookie作用路径配置错误
你在Session配置中显式设置了options.Cookie.Path = "/api/";,该配置会告知浏览器:仅当请求路径以/api/为前缀时,才在请求头中携带Session对应的Cookie。当你直接刷新/dashboard这类前端路由时,请求路径不匹配该前缀,浏览器不会上传Session Cookie,服务端自然无法读取到存在Session中的用户认证信息。全局授权回退策略覆盖范围过大
你配置了options.FallbackPolicy = options.DefaultPolicy;,该策略会对所有未显式标注授权规则的端点生效,包括你用来承接Angular前端路由的MapFallbackToFile端点——这个端点的作用是返回index.html供前端完成路由渲染,本身不需要身份校验,但被全局策略拦截后会强制触发自定义认证逻辑,拿不到Session信息就直接返回401,请求根本不会走到返回静态页面的流程。
本地Kestrel调试时功能正常,通常是本地开发环境下浏览器对Cookie路径的限制未严格生效,或是调试时没有触发非/api路径下的认证校验。手动导航到根路径后功能恢复,是因为根路径请求加载静态资源时不会触发强认证拦截,等前端初始化完成后发起/api前缀的接口请求时,浏览器会正常携带Session Cookie,认证状态就恢复了。
按以下步骤调整配置即可解决问题:
- 修正Session Cookie的作用路径,删除错误的
/api/路径配置,ASP.NET Core默认会将Cookie路径设置为站点根路径/,保证所有站点路径下的请求都能正常携带Session Cookie:
builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromHours(8); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; // 删除此行错误配置:options.Cookie.Path = "/api/"; });
- 给前端回退端点放开匿名访问权限,避免静态页面请求被认证逻辑拦截:
// 将原来的回退路由配置修改为如下形式 app.MapFallbackToFile("{**slug}", "index.html").AllowAnonymous();
- (可选优化)如果你的身份校验仅针对API接口生效,建议移除全局的
FallbackPolicy配置,转而通过控制器特性、路由约定等方式仅给/api前缀的接口配置授权要求,从根源上避免静态资源请求被认证流程拦截。
配置修改完成后重新部署应用,直接刷新前端子路由页面就不会再出现401错误。
内容的提问来源于stack exchange,提问作者Chris

