使用SPN通过AZ CLI创建Azure AD应用注册时无法生成关联服务主体
我创建了一个Azure DevOps服务连接,使用名为master-app的应用注册/SPN,该SPN拥有以下Microsoft Graph应用权限(已获得管理员同意):
Application.ReadWrite.All Application.ReadWrite.OwnedBy Directory.ReadWrite.All
此前执行命令az ad app create --display-name mynewapp时,会同时创建mynewapp应用注册及其关联的SPN,但近两日执行该命令仅能创建应用注册,无法生成关联SPN。我尝试执行az account clear/az logout并重新使用master-app的客户端ID和密钥ID登录,但问题依旧。
请问可能是什么原因导致的?我看到有说法称SPN只能创建无SPN的应用注册,但此前流水线明明可以成功创建带SPN的应用注册,这该如何解释?
1. Azure CLI版本变更
近期Azure CLI的版本更新可能调整了az ad app create的默认行为,或者引入了相关bug。az ad app create默认会同时创建应用注册和关联服务主体,除非显式添加--enable-service-principal false参数。你可以回退到之前能正常工作的CLI版本测试,例如:
az upgrade --version 2.51.0 # 替换为之前成功的版本号
同时可查看Azure CLI的Release Notes,确认是否有关于应用注册/服务主体创建逻辑的变更。
2. Azure AD租户配置限制
租户管理员可能近期修改了应用注册相关的权限设置:
- 检查Azure AD的用户设置 -> 应用注册中的谁可以创建应用注册选项,是否设置为仅允许管理员创建,或限制了服务主体创建服务主体的权限;
- 部分租户会启用**"禁止非管理员创建服务主体"**的隐性限制,即使SPN拥有
Application.ReadWrite.All权限,也会被阻止自动生成关联SPN。
3. 权限有效性或范围变更
虽然你确认SPN拥有指定权限,但可能存在以下情况:
- 权限被管理员撤销或修改了作用范围(比如从全局租户范围改为特定组/应用范围);
Directory.ReadWrite.All权限是否真的有效?创建服务主体需要该权限或Application.ReadWrite.All的全局范围授权,若权限范围被缩小,会导致无法生成SPN。
4. 关于"SPN只能创建无SPN的应用注册"的说法
这个说法并不准确。SPN默认可以创建带关联服务主体的应用注册,前提是拥有足够的权限(如你配置的Application.ReadWrite.All或Directory.ReadWrite.All)。此前流水线能成功,说明当时租户配置、权限和CLI环境都满足条件,当前问题大概率是后续环境或配置发生了变更,而非SPN本身的固有限制。
- 在本地用
master-app的身份执行az ad app create --display-name test-app,验证是否能复现问题,排除Azure DevOps服务连接的环境影响; - 执行
az account show确认当前登录的租户、身份信息是否正确,确保是用master-app的身份在目标租户下操作; - 联系租户管理员检查Azure AD的应用注册和服务主体创建权限设置;
- 回退Azure CLI版本到之前的稳定版本测试。
内容的提问来源于stack exchange,提问作者Buggy B

