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

