三步搞定Azure AD+OAuth2 SSO集成:从注册到用户信息获取

张开发
2026/4/18 12:58:02 15 分钟阅读

分享文章

三步搞定Azure AD+OAuth2 SSO集成:从注册到用户信息获取
1. 为什么需要Azure ADOAuth2 SSO集成单点登录SSO已经成为现代企业应用的标准配置。想象一下如果你每天要登录十几个不同的系统每个系统都要输入用户名密码那简直是场噩梦。而Azure AD作为微软的企业级身份认证服务配合OAuth2协议能完美解决这个问题。我去年帮一家电商公司做系统整合时就遇到过这种需求。他们原有CRM、ERP、WMS等8个独立系统员工每天要反复登录。接入Azure AD SSO后登录效率提升了70%IT部门收到的密码重置请求直接减少了90%。OAuth2之所以成为SSO的首选方案主要因为它的几个核心优势标准化程度高几乎所有云服务都支持OAuth2协议安全性好采用令牌机制而非直接传递密码用户体验佳只需一次登录即可访问所有授权应用扩展性强支持移动端、Web端、服务端等多种场景2. 第一步Azure AD应用注册2.1 创建应用注册首先登录Azure门户portal.azure.com在左侧菜单找到Azure Active Directory服务。进入后选择应用注册点击新注册。这里有个坑我踩过应用名称最好用英文且具有业务含义比如ERP-SSO-Client。中文名称在某些接口调用时可能会出现编码问题。注册时需要特别注意两个配置项支持的账户类型根据实际需求选择仅限此组织目录中的账户单租户任何组织目录中的账户多租户个人Microsoft账户重定向URI这是认证成功后跳转的地址必须使用HTTPS。开发阶段可以用localhost测试但生产环境必须配置正式域名。2.2 配置应用密钥和权限注册完成后进入证书和密码页面点击新建客户端密码。这里生成的密钥一定要立即保存因为离开页面后就无法再次查看。我建议设置较长的有效期比如24个月并做好密钥轮换计划。接下来配置API权限添加Microsoft Graph的User.Read权限对于管理员需要同意的权限记得点击授予管理员同意如果需要更多用户信息可以添加profile、email等权限重要提示不要过度申请权限遵循最小权限原则。我曾经见过一个应用申请了30多个权限结果安全审计时被要求全部重新评估。3. 第二步获取OAuth2访问令牌3.1 构建授权请求授权码模式是最安全的OAuth2流程也是Azure AD推荐的方式。你需要构造如下格式的URLhttps://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize? client_id{client_id} response_typecode redirect_uri{encoded_redirect_uri} scopeopenid%20profile%20email state12345几个关键参数说明tenant可以是租户ID或commonscope空格需要用%20替换多个scope用空格分隔state建议生成随机字符串用于防CSRF攻击实测中发现一个常见问题redirect_uri必须和注册时配置的完全一致包括末尾的/。有次我因为少写了个斜杠调试了整整两小时。3.2 交换访问令牌当用户完成认证后Azure AD会重定向到你的回调地址并附带授权码。你需要用这个code换取access_tokenimport requests token_url fhttps://login.microsoftonline.com/{tenant}/oauth2/v2.0/token data { client_id: client_id, client_secret: client_secret, code: authorization_code, redirect_uri: redirect_uri, grant_type: authorization_code } response requests.post(token_url, datadata) token_data response.json() access_token token_data[access_token]这里有个性能优化点access_token通常1小时过期但会同时返回refresh_token。建议实现令牌自动刷新逻辑避免频繁跳转登录页面。4. 第三步获取用户信息4.1 调用Microsoft Graph API拿到access_token后就可以获取用户信息了const response await fetch(https://graph.microsoft.com/v1.0/me, { headers: { Authorization: Bearer ${accessToken} } }); const userData await response.json(); console.log(userData);返回的典型用户信息包括id用户在Azure AD中的唯一标识displayName显示名称mail邮箱地址userPrincipalName用户主体名称4.2 处理用户会话建议在后端建立自己的用户会话而不是直接依赖Azure AD的token。我的常规做法是用Azure AD用户ID作为唯一标识在本地数据库建立映射关系设置合理的会话过期时间记录登录日志用于审计对于前端可以把必要的用户信息缓存在localStorage但敏感信息一定要加密。曾经有个项目因为直接存储了完整token导致XSS漏洞被利用。5. 常见问题排查指南5.1 错误AADSTS700016Application with identifier was not found in the directory这个错误我遇到过不下十次。可能原因包括client_id拼写错误应用注册在错误的租户下应用已被删除解决方法仔细检查Azure门户中的应用注册列表确认client_id和tenant_id完全匹配。5.2 令牌过期问题access_token默认有效期是1小时。如果应用需要长时间运行应该在令牌过期前用refresh_token获取新token实现自动刷新逻辑处理并发请求时的令牌刷新竞争条件我曾经实现过一个令牌管理中间件自动处理所有这些问题代码量不大但非常实用。5.3 跨域问题如果前端直接调用Graph API可能会遇到CORS限制。解决方案有通过后端代理API请求配置Azure AD应用注册的Web平台重定向URI使用MSAL.js等前端库在最近的一个Vue项目中我采用Nginx反向代理完美解决了这个问题同时还提升了性能。

更多文章