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

ASP.NET Core 8对接AD FS时前端通道注销(FrontChannel Logout)未清除应用Cookie的问题及内置方案咨询

ASP.NET Core 8对接AD FS时前端通道注销(FrontChannel Logout)未清除应用Cookie的问题及内置方案咨询

大家好,我目前在使用ASP.NET Core 8的Microsoft.AspNetCore.Authentication.OpenIdConnect库对接本地AD FS(应用组/NativeClientApplication)做认证,正常的登录流程和从应用内直接注销都没有问题,但碰到了前端通道注销(FrontChannel Logout)的异常情况,想请教下有没有内置的解决方案,或者是不是我配置上漏了什么?

问题场景

按前端通道注销的流程:

  • 我先在OAuth应用A登录,通过SSO免登录进入另一个应用B;
  • 在应用B点击注销后,AD FS会向所有已授予SSO的应用发起清理请求;
  • 我能看到AD FS向应用A发送了注销请求,之后也跳回了AD FS的登录页,但直接导航回应用A时,发现用户仍然处于登录状态——因为应用A的认证Cookie没有被前端通道注销流程清除(已经排查过Cookie的SameSite设置,没有问题)。

排查过程

  • 我给OpenIdConnectHandler类里的HandleRemoteSignOutAsync方法加了功能性断点,能看到AD FS的注销请求确实触发了这个方法,而且代码完整执行没有中断,但Cookie就是没被清除;
  • 直接从应用内注销的代码是正常工作的,代码如下:
await HttpContext.SignOutAsync(
    OpenIdConnectDefaults.AuthenticationScheme,
    new AuthenticationProperties { RedirectUri = new Uri($"{Request.Scheme}://{Request.Host}{Request.PathBase}").ToString() }
);

当前的配置

我的认证服务配置代码如下:

builder.Services.AddAuthentication(configureOptions =>
{
    configureOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    configureOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
}).AddCookie(configureOptions =>
{
    configureOptions.SlidingExpiration = true;
}).AddOpenIdConnect(configureOptions =>
{
    configureOptions.SaveTokens = true;
    configureOptions.MetadataAddress = "https://my.idp.com/adfs/.well-known/openid-configuration";
    configureOptions.ResponseType = OpenIdConnectResponseType.IdToken;
    configureOptions.SignOutScheme = OpenIdConnectDefaults.AuthenticationScheme;
    configureOptions.Scope.Clear();
    configureOptions.Scope.Add("openid");
    configureOptions.CallbackPath = "/signin-oidc";
    configureOptions.RemoteSignOutPath = "/signout-oidc";
    configureOptions.SignedOutCallbackPath = "/signout-callback-oidc";
    configureOptions.ClientId = "https://example.com/applications/oauthpassive/";
});

临时 workaround

经过进一步排查,我通过添加事件处理找到了临时解决办法:在OpenIdConnect配置的Events里手动处理远程注销事件,主动清除Cookie:

configureOptions.Events = new OpenIdConnectEvents
{
    OnRemoteSignOut = async context =>
    {
        await context.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    }
};

不过我还是好奇,这种前端通道注销的场景,官方有没有内置的处理逻辑?是不是我哪里配置错了导致内置逻辑没生效?麻烦各位大佬指点一下!

备注:内容来源于stack exchange,提问作者DominikAmon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:03:06