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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:54:50