获取图形 api 的天蓝色身份

时间:2021-01-30 13:09:39

标签: azure azure-active-directory azure-managed-identity

我目前正在使用以下代码来获取数据工厂的服务主体。此代码在本地运行良好,我能够检索 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 配置文件(我假设 DevOps 任务 AzureCLI@2 将创建)并将其挂载到 docker。此外,访问令牌 拥有的是 client_secret,而不是实际的令牌(长字符串)。 在代码中是否有更好的方法?

感谢您的时间!

1 个答案:

答案 0 :(得分:1)

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

如果您想使用 Azure Identity for Python,您可以使用 AzureCliCredential 类获取访问令牌。

from azure.identity import AzureCliCredential

credential = AzureCliCredential()
access_token = credential.get_token(scopes=["..."])
相关问题