WPF应用中SSO自动登录后Web应用单点登录失效问题求助
环境配置
- 主WPF应用:基于ADFS + MSAL(
PublicClientApplication)实现登录 - 自定义WebView2控件:依托
PublicClientApplication完成集成,用于托管Web应用 - 托管的Angular应用:同样采用ADFS + MSAL方案实现登录
- 目标:复用WPF登录生成的MSAL缓存,实现Angular应用的SSO
问题描述
此前集成逻辑正常,但当用户开启SingleSignOnUser标识后,WPF通过AcquireTokenSilent API实现启动无提示自动登录时,托管的Angular应用无法触发SSO。已确认用户数据文件夹及MSAL缓存未被删除,理论上该场景应支持SSO,求同类问题经验或原因分析。
可能的原因及排查方向
MSAL缓存跨环境不共享
WPF的PublicClientApplication默认将缓存存在本地文件系统,而WebView2中Angular SPA的MSAL缓存是浏览器端的sessionStorage/localStorage,两者无直接关联。自动登录时,WPF仅从本地缓存获取token,未将身份上下文同步到WebView2的浏览器环境。ADFS SSO Cookie未同步至WebView2
AcquireTokenSilent属于静默流程,不会触发ADFS的交互授权,因此WebView2的浏览器环境无法获取ADFS的SSO会话Cookie。而Angular SPA跳转ADFS登录时,需依赖该Cookie识别已登录状态,缺失则会重新触发登录流程。WebView2用户数据目录配置独立
若自定义WebView2时指定了独立的用户数据目录,会与WPF应用的MSAL缓存目录断开关联,导致ADFS的SSO上下文无法在两者间共享。检查WebView2初始化时的CoreWebView2Environment配置,确认是否与WPF应用使用相同的用户数据路径。账户信息未主动传递至Angular
WPF自动登录后,未主动将已登录账户的关键信息(如账户ID、租户ID)传递给WebView2内的Angular应用,导致Angular端MSAL无法主动触发acquireTokenSilent请求,只能等待跳转登录页后再处理。
可行解决思路
- WPF自动登录成功后,通过WebView2的
ExecuteScriptAsync方法主动通知Angular应用已登录的账户信息,触发Angular端MSAL的静默token请求。 - 确保WebView2使用的用户数据目录与WPF应用的MSAL缓存目录关联,或配置ADFS允许跨应用的SSO Cookie共享。
- 检查WPF的
AcquireTokenSilent调用是否获取到包含Angular应用客户端ID受众(aud)的token,确保ADFS认可该token的跨应用使用权限。
内容的提问来源于stack exchange,提问作者Barry Allen

