部署服务主体配置Azure SQL外部用户的权限需求及问题排查
问题描述
已完成以下配置:
- 为Azure SQL实例设置Azure Active Directory管理员
- 配置Azure SQL仅允许Azure AD身份验证
- 为Azure SQL实例配置托管标识
- 为部署服务主体分配Azure
Directory Readers角色
个人身份登录数据库时,执行命令成功:
CREATE USER [my-managed-apiname] FROM EXTERNAL PROVIDER
但通过Azure DevOps流水线执行同一命令时,报错:
Principal 'my-managed-apiname' could not be resolved. Error message: 'AADSTS700016: Application with identifier 'GUID' was not found
猜测是部署服务主体的访问权限问题,需调整应用注册或企业应用的哪些设置?
解决方案
一、调整目标托管标识的企业应用可见性
如果my-managed-apiname是用户分配的托管标识:
- 进入Azure AD -> 企业应用,找到该托管标识对应的条目(名称与托管标识一致)
- 进入属性页面,将“对用户和组可见?”设置为「是」(若设为否,非全局管理员权限的服务主体无法读取该标识)
二、为部署服务主体补充Microsoft Graph权限
Directory Readers角色可能不足以让服务主体读取所有应用/托管标识,需添加更明确的应用权限:
- 进入Azure AD -> 应用注册,找到部署服务主体对应的应用注册
- 切换到API权限 -> 点击「添加权限」
- 选择「Microsoft Graph」-> 「应用权限」
- 添加
Application.Read.All权限(允许服务主体读取Azure AD中所有应用、服务主体及托管标识) - 点击「授予管理员同意」(需全局管理员权限执行)
三、验证托管标识的应用ID匹配
- 进入Azure门户 -> 托管标识,找到
my-managed-apiname对应的标识,复制「应用程序ID」 - 对比报错信息中的GUID,确认两者一致:
- 若不一致,说明命令中的
my-managed-apiname名称错误,或托管标识已被重新创建
- 若不一致,说明命令中的
四、流水线身份验证确认
- 确保流水线使用的服务主体是已分配
Directory Readers角色的那个,避免身份误用 - 确认流水线连接Azure SQL时,采用的是Azure AD身份验证方式(如使用服务主体的客户端ID、租户ID及密钥/证书)
内容的提问来源于stack exchange,提问作者The Senator
相关产品推荐
相关产品推荐

