如何结合Azure AD认证与数据库账号密码登录并获取AD令牌?
解决方案:自定义数据库账号密码登录并获取Azure AD令牌
核心逻辑
你需要先完成自定义数据库账号密码的本地验证,再通过Azure AD的身份关联机制,获取对应用户的带权限角色的ID令牌和访问令牌。核心是将数据库用户与Azure AD用户建立关联,验证自定义凭据后,以关联的Azure AD身份请求令牌。
具体步骤
1. 预准备:数据库用户与Azure AD用户关联
确保你的数据库中每个用户记录,都存储了对应的Azure AD用户标识(比如Object ID或User Principal Name (UPN))。这是后续映射Azure AD身份的关键。
2. 自定义账号密码验证
先执行本地认证逻辑:
- 接收用户输入的用户名、密码
- 从数据库查询该用户的加盐哈希密码(禁止明文存储,推荐使用
bcrypt/Argon2等强哈希算法) - 验证输入密码与存储的哈希值是否匹配
- 验证通过后,取出该用户关联的Azure AD用户信息(如UPN)
3. 获取Azure AD令牌(两种可行方案)
方案A:客户端凭据流 + On-Behalf-Of(OBO)流(生产环境推荐)
该方案通过后端服务代理,以用户身份获取令牌,支持MFA,符合安全最佳实践:
- Azure AD应用配置:
- 注册后端服务为Azure AD应用,生成客户端密钥(或证书)
- 为应用添加所需的委托权限(如
Microsoft Graph/User.Read、业务API的权限),并授予管理员同意
- 后端执行令牌请求:
- 第一步:用后端应用的客户端凭据获取应用令牌:
curl -X POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id={backend-app-client-id}" \ -d "client_secret={backend-app-client-secret}" \ -d "grant_type=client_credentials" \ -d "scope=https://graph.microsoft.com/.default" - 第二步:用应用令牌调用OBO流,获取用户令牌:
curl -X POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \ -d "client_id={backend-app-client-id}" \ -d "client_secret={backend-app-client-secret}" \ -d "assertion={backend-app-access-token}" \ -d "scope={your-api-scope} openid profile" \ -d "requested_token_use=on_behalf_of" - 响应会返回
id_token(含用户身份信息)和access_token(含用户权限/角色)
- 第一步:用后端应用的客户端凭据获取应用令牌:
方案B:Azure AD B2C自定义策略(面向外部用户场景)
如果你的用户是外部用户,可通过Azure AD B2C自定义策略实现:
- 配置B2C自定义策略,添加本地账户(数据库存储)的认证流程
- 集成Azure AD作为身份提供者,在用户用自定义密码登录后,B2C自动颁发包含权限角色的Azure AD兼容令牌
- 该方案无需后端代理,直接由B2C处理身份映射与令牌颁发
关键注意事项
- 密码安全:必须使用加盐哈希存储密码,绝对禁止明文或弱加密
- 权限配置:确保Azure AD中对应的用户已被分配所需的应用角色/权限,否则令牌不会包含这些信息
- OBO流限制:最多支持3层嵌套,且后端应用需拥有对应权限的管理员同意
- ROPC流风险:不推荐使用ROPC流(该流不支持MFA,不符合安全规范),仅在极端场景下考虑
内容的提问来源于stack exchange,提问作者Elizabeth
相关产品推荐
相关产品推荐

