GitHub Actions多作业Azure登录Subject Identifier不一致问题排查
问题原因
GitHub Actions通过OIDC向Azure认证时,生成的身份令牌Subject Identifier(sub字段)是根据作业上下文动态生成的:
- 当作业配置了
environment参数时,sub会包含environment:{环境名}的标识,这就是你deploy-arm作业生成repo:OrganisationName/RepositoryName:environment:dev的原因 - 如果作业没有绑定环境,
sub就会默认使用当前触发分支的ref路径,也就是deploy-apps作业里的repo:OrganisationName/RepositoryName:ref:refs/heads/develop
你的Azure AD权限配置应该只允许了前者的sub值,所以deploy-apps作业的认证会失败。
解决办法
方法1:给所有部署作业绑定同一个环境
在deploy-apps作业的配置里加上environment: dev,让它和deploy-arm作业使用相同的sub格式。示例配置:
jobs: deploy-apps: runs-on: ubuntu-latest environment: dev # 绑定和ARM部署相同的环境 strategy: matrix: app: [app1, app2, app3] steps: - uses: azure/login@v1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} # 后续应用部署步骤
方法2:在Azure AD中添加多个允许的Subject值
如果不想用环境绑定,可以在Azure AD的对应应用注册里,把两个sub值都加入允许列表:
- 登录Azure门户,找到GitHub OIDC对应的应用注册
- 进入令牌配置,添加并启用
sub可选声明 - 在该应用的权限配置里,添加两个允许的
sub值:repo:OrganisationName/RepositoryName:environment:dev和repo:OrganisationName/RepositoryName:ref:refs/heads/develop
这样不管哪个sub格式,都能通过Azure的身份验证。
方法3:移除ARM部署作业的环境配置
如果不需要用到GitHub环境功能,可以直接删掉deploy-arm作业里的environment参数,让它的sub也变成分支ref格式,和deploy-apps作业保持一致。
内容的提问来源于stack exchange,提问作者Nimesco
相关产品推荐
相关产品推荐

