ADFS 2016 OAuth登出后未重定向至登录页的技术求助
解决ADFS 2016下ng2-adal登出后无法重定向的问题
根据你描述的情况,登录正常但登出时ADFS拒绝重定向,核心原因是ADFS对登出请求的PostLogoutRedirectUri验证逻辑,和登录时的重定向URI验证是相互独立的——即使你已经配置了登录用的重定向URI,登出对应的URI可能没被正确添加到ADFS的允许列表,或者ng2-adal的登出配置存在疏漏。下面是具体的排查和解决步骤:
1. 检查ADFS原生客户端的登出重定向URI配置
ADFS 2016中,原生客户端应用的Redirect URIs通常用于授权码流的登录回调,但登出请求的PostLogoutRedirectUri需要确保也被包含在允许列表中:
- 打开ADFS管理控制台,找到你的应用组,进入原生客户端应用的属性页面
- 在Redirect URIs列表中,确认
http://localhost:4200/login已经存在(注意:大小写、末尾斜杠、协议(http/https)必须完全匹配,比如不能把http写成https,也不能少了末尾的/login) - 如果不存在,点击添加按钮将其加入,保存配置
如果图形界面配置后还是有问题,建议用PowerShell确认和修改:
# 查看指定原生客户端的所有重定向URI Get-AdfsNativeClientApplication -Name "你的原生客户端名称" | Select-Object RedirectUris # 如果缺失登出URI,添加进去 Set-AdfsNativeClientApplication -Name "你的原生客户端名称" -RedirectUri @{add="http://localhost:4200/login"}
2. 确认ng2-adal的登出配置是否正确
ng2-adal默认不会自动将登出后的重定向URI设置为你期望的/login,需要显式配置或调用:
- 在adal的初始化配置中,确保设置了
postLogoutRedirectUri:const config: AdalConfig = { tenant: '你的ADFS租户ID', clientId: '你的客户端ID', redirectUri: window.location.origin + '/', postLogoutRedirectUri: 'http://localhost:4200/login', // 显式指定登出后的重定向地址 // 其他配置... }; - 调用登出方法时,也可以直接传入目标路径:
this.adalService.logout('/login');
3. 排查ADFS的验证细节
- 检查事件查看器中的完整错误日志,确认错误对应的客户端ID是否是当前Angular应用使用的ID,避免配置错了应用组
- 清除浏览器缓存和ADFS的会话(可以通过访问
https://你的ADFS地址/adfs/ls/?wa=wsignout1.0手动登出ADFS),再测试登出流程
4. 特殊情况:ADFS 2016的登出URI限制
部分ADFS 2016版本中,原生客户端的登出重定向URI可能需要和登录重定向URI使用相同的域名前缀,或者需要在Web API应用的配置中额外添加(如果你的应用组包含Web API)。可以尝试在应用组的Web API属性中,将http://localhost:4200/login添加到Identifiers或Redirect URIs中(根据ADFS版本不同,位置可能有差异)。
内容的提问来源于stack exchange,提问作者Ricky Stam
相关产品推荐
相关产品推荐

