Azure Identity 获取图表 api

azure identity to get graph api

我目前正在使用以下代码获取数据工厂的服务主体。此代码在本地运行良好,我能够检索 serviceprincipal。 这个问题是我获得身份的方式。我需要提供客户详细信息(这是在 AD 中创建的用于测试目的的演示应用程序注册。)

try:
    app = msal.ConfidentialClientApplication(
        self.input_client_id, authority=self.input_authority,
        client_credential=self.input_secret,
        )
    result = app.acquire_token_for_client(scopes=self.input_scope)
    
    input_endpoint = "https://graph.microsoft.com/v1.0/servicePrincipals?$filter=startswith(displayName,'{}')".format(datafactory_name)
    graph_data = requests.get(
    input_endpoint,
    headers={'Authorization': 'Bearer ' + result['access_token']},).json()

我想避免这样做,因为我使用 devops 管道 运行 容器注册表中的此代码,并希望避免将秘密作为变量提供。 管道使用服务连接,我使用 Azure CLI 任务登录。

有没有办法替换上面的代码获取客户端凭证。

以下是一些已经在本地完成的试验:

使用 azure devops 服务连接在本地登录以模拟 devops 管道进行测试

az login --service-principal --username <clientid> --password <client_secret> --tenant <tenant_id>  
from azure.common.credentials import get_azure_cli_credentials

credentials, subscription = get_azure_cli_credentials()

app = msal.ConfidentialClientApplication(
self.input_client_id, authority=self.input_authority,
client_credential=credentials,
)

这给出了一个错误:'error':'invalid_client'

  1. 另一种方法,我在本地的“.azure”文件夹中读取了 accessToken.json 文件。我在 json 中得到了 access_token 值,它是 然后替换了 client_credential 使用此值。这奏效了。但随后在 devops 中。我必须创建 .azure 配置文件(我假设 AzureCLI@2 将创建 devops 任务)并将其安装到 docker。另外,accessToken 有 client_secret,而不是实际的标记(长字符串)。 在代码中有更好的方法吗?

感谢您的宝贵时间!

可能是因为client_secret含有特殊字符。一种解决方法是转到 Azure 门户并不断生成新的机密,直到您获得其中没有特殊字符的机密为止。有关详细信息,请参阅 here

如果您想使用 Azure Identity for Python, you could get access token with AzureCliCredential Class.

from azure.identity import AzureCliCredential

credential = AzureCliCredential()
access_token = credential.get_token(scopes=["..."])