使用服务主体 - invalid_client 从发布管道运行 Azure CLI 脚本

awj*_*awj 2 azure azure-cli devops azure-pipelines-release-pipeline

我有一个 Azure CLI 脚本,它在 Cloud Shell 中运行得很好,但当我尝试将其包含在 devops 发布管道中时遇到了麻烦。出于调试目的,我已将脚本简化为仅作为服务主体登录,然后检索版本...

az login --service-principal -u http://[Service Principal name] -p [Service Principal password] --tenant [Service Principal tenant GUID]
az --version
Run Code Online (Sandbox Code Playgroud)

...但它仍然会出现同样的错误。

以下是我的Azure CLI任务的属性:

脚本类型:Shell
脚本位置:Inline script
内联脚本:[如上所述]
脚本参数:
访问脚本中的服务主体详细信息:false
使用全局 Azure CLI 配置:false
工作目录:
标准错误失败:false
已启用:true
出现错误时继续:false*
环境变量:

错误是:

2020-06-15T12:46:39.8710944Z ##[错误]错误代​​码:[1]
2020-06-15T12:46:39.8724737Z ##[错误]错误:Azure 登录失败
2020-06-15T12:46:39.8728448 Z ##[error]脚本失败,出现错误:获取令牌请求返回 http 错误:401 和服务器响应:{“error”:“invalid_client”,“error_description”:“AADSTS7000222:提供的客户端密钥已过期。请访问 Azure用于为应用程序创建新密钥的门户,或考虑使用证书凭据来提高安全性: https: //learn.microsoft.com/azure/active-directory/develop/active-directory-certificate-credentials
跟踪 ID:d0f42793-739e- 4ce9-9118-5049086aa800
相关 ID:2ad50471-9c2a-4c02-a4d0-189efad2f0c8
时间戳:2020-06-15 12:46:39Z","error_codes":[7000222],"timestamp":"2020-06-15 1 2 :46:39Z","trace_id":"d0f42793-739e-4ce9-9118-5049086aa800","correlation_id":"2ad50471-9c2a-4c02-a4d0-189efad2f0c8","error_uri":" https://login.microsoftonline .com/error?code=7000222 “}

我能够使用 Azure Cloud Shell 作为此服务主体进行身份验证,因此我很困惑为什么我显然无法在发布管道中执行相同的操作。

* 我尝试使用“错误继续:true ”,尽管任务完成,但输出中出现相同的错误。

Joy*_*ang 7

要在 Azure CLI 中使用服务主体,无需手动登录。

正确的方法请按照以下步骤操作。

1.从错误消息来看,您的服务主体client secret(即client key)已过期。因此,您需要先检查它,导航到azure 门户-> Azure Active Directory-> App registrations-> All applications-> 找到与您的服务主体相关的 AD 应用程序 -> Certificates & secrets-> 检查密钥是否过期。如果过期了,只需点击New client secret创建一个新的并保存该值即可。

在此输入图像描述

2.在 devops 中,导航至Project Settings-> Service connections-> New service connection-> Azure Resource Manager-> Service principal (manual)

在此输入图像描述

在此输入图像描述

在此输入图像描述

然后使用您的服务主体修复选项,您可以从应用程序注册页面中的 AD 应用程序获取值。该Service Principal IdApplication (client) ID,该Service principal keyclient secret

在此输入图像描述

Subscription IdSubscription Name您想要使用 Azure CLI 访问的,您可以在 azure 门户中找到它们。

在此输入图像描述

输入值后 -> Verify-> Verify and save

在此输入图像描述

3.在您的Azure CLI任务中 -> Azure Resource Manager connection-> 选择步骤 2 中的服务连接。在我的示例中,我测试在我的订阅中获取一个 Web 应用程序az webapp show --name xxxx --resource-group xxxx注意:无需az login手动使用,它将使用服务主体登录自动在服务连接中配置)。

在此输入图像描述

然后运行一下,看看结果,一切正常。

在此输入图像描述