内嵌于Angular父应用iFrame的Angular子应用Azure AD免二次登录实现咨询
需求可实现性确认
该需求完全可以实现,无需用户在子应用中二次输入账号密码完成登录。
完整实现步骤
Azure 门户配置
- 确认两个Angular应用对应的应用注册都归属同一个Azure AD租户
- 配置子应用的信任父应用规则:进入子应用的应用注册页,依次点击「管理」→「公开API」→「已知客户端应用」,添加父应用的Client ID后保存,该配置会告知Azure AD父应用的有效登录态可被子应用复用
- 开启iframe鉴权支持:分别进入两个应用的应用注册页,点击「管理」→「身份验证」→找到单页应用对应的配置块,勾选「允许在iframe中加载身份验证响应」选项后保存,解决Azure AD鉴权页面被iframe拦截的问题
- 可选配置:如果两个应用需要访问同一套后端API,给两个应用配置完全相同的API权限,避免后续Token权限校验失败
注意:如果两个应用部署在不同的一级域名下,Chrome、Edge等现代浏览器会默认拦截Azure AD下发的第三方Cookie,导致静默鉴权失败。建议将两个应用部署在同一个父域名下,仅子域名有区别(比如父应用
app1.xxx.com、子应用app2.xxx.com),即可规避该问题。
代码调整
两个应用均使用MSAL.js v2及以上版本可获得最好的兼容性,仅需要调整少量参数即可:
- 两个应用的MSAL初始化参数中的
authority必须完全一致,统一使用租户级授权地址,格式为https://login.microsoftonline.com/{你的租户ID},不要使用common或者其他不同的授权地址 - 子应用的MSAL登录请求配置中,将
prompt参数设置为none,MSAL会优先尝试通过静默方式获取Token,不会触发重定向或者弹出登录窗口 - 父应用完成登录流程、成功获取到Token之后,再加载嵌套子应用的iframe,避免子应用早于父应用发起鉴权请求导致失败
常见问题解答
是否仅通过Azure配置即可实现免登?
不能,必须配合上述的少量代码参数调整。Azure配置仅完成了两个应用之间的信任关系声明,子应用还需要通过调整MSAL参数触发静默鉴权逻辑,才能复用父应用的登录态。
父子应用获取的Token是否一致?
不一致,两者的Token是相互独立的:
- Token的受众(aud字段)和应用的Client ID绑定,两个应用的Client ID不同,所以生成的id_token、access_token都不相同
- 两个Token中携带的用户身份信息、租户信息是完全一致的
- 只要两个应用都申请了相同的后端API权限,两个Token都可以正常通过后端的权限校验
内容的提问来源于stack exchange,提问作者Aakash Kumar
相关产品推荐
相关产品推荐

