You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DevOps流水线中Service Principal凭据突然失效问题求助

Azure DevOps流水线中Service Principal Key为空的解决方法

问题现象

此前在Azure DevOps流水线的AZ CLI或PWSH任务中可正常使用Service Principal,从昨日起失效。配置addSpnToEnvironment: true后,发现servicePrincipalKey为空值。

流水线代码

- task: AzureCLI@2
    displayName: 'Get Azure CLI credentials'
    inputs:
      azureSubscription: $(serviceConnection)
      scriptType: 'pscore'
      scriptLocation: inlineScript
      addSpnToEnvironment: true
      useGlobalConfig: true
      inlineScript: |
        $InformationPreference = "Continue"
        Write-Information "##vso[task.setvariable variable=CLIENT_ID]$env:servicePrincipalId" | Out-Null
        Write-Information "##vso[task.setvariable variable=CLIENT_SECRET]$env:servicePrincipalKey" | Out-Null
        if ([string]::IsNullOrEmpty($env:servicePrincipalKey)) {
          Write-Warning "Service principal key is empty"
        }
        elseif ([string]::IsNullOrEmpty($env:servicePrincipalId)) {
          Write-Warning "Service principal id is empty"
        }
        else {
          Write-Output "Service principal id and key are set"
        }

  - task: Powershell@2
    displayName: Output SPN
    inputs:
      targetType: inline
      workingDirectory: '$(System.DefaultWorkingDirectory)'
      script: |
        Write-Host "CLIENT_ID: '$env:CLIENT_ID')"
        Write-Host "CLIENT_SECRET: '$env:CLIENT_SECRET'"

执行结果

AzureCLI@2 task:

WARNING: Service principal key is empty

Powershell@2 task:

CLIENT_ID: '***')

CLIENT_SECRET: ''

解决步骤

1. 检查服务连接的密钥与权限

  • 进入Azure DevOps项目项目设置→服务连接,找到对应的$(serviceConnection)服务连接
  • 点击编辑,确认服务主体密钥是否过期:手动创建的SPN密钥可能已到期,需重新生成密钥并更新到服务连接中
  • 确认服务主体拥有流水线所需的Azure资源权限(如Contributor角色)

2. 调整变量传递方式

addSpnToEnvironment并非在所有场景下都会暴露servicePrincipalKey,可改用Azure CLI内置命令获取凭据:

- task: AzureCLI@2
  displayName: 'Get Azure CLI credentials'
  inputs:
    azureSubscription: $(serviceConnection)
    scriptType: 'pscore'
    scriptLocation: inlineScript
    inlineScript: |
      # 获取服务主体ID
      $spId = (az account show --query user.name -o tsv)
      Write-Information "##vso[task.setvariable variable=CLIENT_ID]$spId"
      # 若必须使用密钥,确保服务连接为密钥认证类型且密钥有效

3. 确认服务连接的认证类型

如果服务连接使用以下认证方式,servicePrincipalKey本身会为空:

  • 托管标识:无需使用密钥,直接通过Azure CLI/SDK自动使用托管标识认证
  • 证书认证:确保代理机器上证书可用,或改为密钥认证(场景允许的话)

4. 检查代理环境

  • 确认代理机器网络正常,能连接Azure AD获取SPN凭据
  • 升级Azure CLI到最新稳定版,旧版本可能存在环境变量暴露的问题

内容的提问来源于stack exchange,提问作者D K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:52:41