.NET 8中Sustainsys.Saml2登出后重定向/Saml2/Logout返回404问题
解决方案:Sustainsys.Saml2登出后/Saml2/Logout 404问题处理
核心原因
Sustainsys.Saml2.AspNetCore2中间件会自动注册/Saml2/Logout端点处理SAML登出响应,你自定义的Action会被中间件路由拦截,永远不会执行。同时默认配置下,该端点处理完登出后缺少正确的跳转逻辑,导致返回404。
1. 删除自定义的LoggedOutController
无需自行实现/Saml2/Logout的Action,中间件已内置该端点的处理逻辑,自定义Action会被完全拦截,没有作用。
2. 配置Saml2中间件的登出跳转路径
修改AddSaml2的配置,指定登出成功后的默认跳转地址,同时确保IdP的登出响应能正确触发跳转:
.AddSaml2(options => { options.SPOptions.EntityId = new EntityId(saml2Options.EntityId); LoadCertificate(options, saml2Options.Certificate); // 设置SP端登出后的默认跳转路径 options.SPOptions.ReturnUrl = "/"; options.IdentityProviders.Add(new IdentityProvider( new EntityId(saml2Options.IdentityProvider.EntityId), options.SPOptions) { MetadataLocation = saml2Options.IdentityProvider.MetadataLocation, LoadMetadata = true, // 可选:指定IdP登出响应的目标地址(若IdP需要) SignOutResponseDestination = "/", }); })
3. 修正ExecuteLogout方法的SignOut调用
确保同时签出Cookie认证方案(你的默认Scheme是Cookie),只签出Saml2Scheme不会清除本地登录Cookie:
[HttpPost] public IActionResult ExecuteLogout() { var props = new AuthenticationProperties { RedirectUri = "/" }; var user = HttpContext.User; var sessionIndex = user.FindFirst(Saml2ClaimTypes.SessionIndex)?.Value; if (!string.IsNullOrEmpty(sessionIndex)) { props.Items.Add(Saml2ClaimTypes.SessionIndex, sessionIndex); } var logoutNameIdentifier = user.FindFirst(Saml2ClaimTypes.LogoutNameIdentifier)?.Value; if (!string.IsNullOrEmpty(logoutNameIdentifier)) { props.Items.Add(Saml2ClaimTypes.LogoutNameIdentifier, logoutNameIdentifier); } // 同时签出Cookie和Saml2认证方案 return SignOut(props, CookieAuthenticationDefaults.AuthenticationScheme, Saml2Defaults.Scheme); }
4. 确认中间件顺序正确
在Program.cs/Startup.cs中,认证中间件必须在授权中间件之前,路由中间件要在认证之后:
app.UseAuthentication(); app.UseAuthorization(); // 确保路由中间件在认证之后 app.MapControllers(); // 若使用Razor Pages则添加 // app.MapRazorPages();
5. 验证IdP配置
检查外部IdP的元数据或后台配置,确保IdP的登出响应(Logout Response)发送到/Saml2/Logout,且RelayState参数正确传递,这样中间件处理完后会自动跳转到指定的RedirectUri。
额外排查方向
- 查看应用日志,确认Sustainsys.Saml2中间件是否有处理
/Saml2/Logout的日志,排查是否有异常导致处理失败 - 确认证书加载正常,中间件需要证书验证IdP的登出响应签名
- 核对
Saml2Settings中的EntityId、MetadataLocation等配置是否与IdP要求一致
内容的提问来源于stack exchange,提问作者FatAlbert
相关产品推荐
相关产品推荐

