如何实现两个Azure应用间的无缝身份认证?
核心结论:不能直接复用应用1的Access Token
应用1生成的Access Token的aud(受众)字段是应用1的Client ID,应用2的后端API在验证Token时会检查aud是否匹配自身的Client ID,不匹配则会直接拒绝请求。所以这个Token无法直接用于访问应用2的资源。
实现跨应用无缝跳转的可行方案
1. 基于Azure AD已有会话的静默登录(推荐前端场景)
用户登录应用1后,Azure AD会在浏览器中保留会话Cookie。当用户从应用1跳转到应用2的前端时,应用2的前端可以利用这个已有会话,通过MSAL库的acquireTokenSilent方法,静默获取应用2专属的Access Token,全程无需用户手动登录:
- 应用2的前端初始化MSAL实例时,配置自身的Client ID、租户ID、redirect URI等参数;
- 当页面加载完成后,调用
acquireTokenSilent,传入应用2所需的API scope(比如api://{应用2ClientID}/access_as_user); - Azure AD会在后台验证已有会话,直接返回应用2的Access Token,不会弹出登录界面。
2. 依赖应用2的受保护路由自动触发SSO
如果应用2的前端路由已经配置了Azure AD身份验证拦截(比如ASP.NET Core应用使用Microsoft.Identity.Web中间件,或单页应用用MSAL的路由守卫),用户从应用1跳转至应用2的受保护页面时:
- 浏览器会携带Azure AD的会话Cookie,应用2的验证逻辑会自动跳转至Azure AD;
- Azure AD检测到已有有效会话,会直接重定向回应用2并携带授权码,应用2后续完成Token获取流程,全程用户无感知。
3. 应用级权限调用(适用于后端互访场景)
如果是应用1的后端需要调用应用2的后端API,而非前端跳转,可以给应用1配置Azure AD的应用权限:
- 在Azure AD中,给应用1添加对应用2 API的应用级权限(而非委托权限);
- 应用1的后端使用Client Credentials Flow获取应用级Token,这个Token可以直接调用应用2的API,无需用户参与。但此方案仅适用于后端服务间的调用,不适合前端用户跳转的场景。
关键注意事项
- 两个应用必须处于同一Azure AD租户下,Azure AD的SSO会话是租户范围的;
- 确保应用2的redirect URI配置与实际部署地址完全一致,否则静默登录会因跨域或配置不匹配失败;
- 使用同一版本的MSAL库(如MSAL.js v2/v3),避免不同版本间的会话兼容性问题;
- 如果用户会话过期或需要多因素认证(MFA),仍会触发登录提示,这是正常的安全机制。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

