我之前使用 ClientSecretCredential 类通过 Azure SDK 进行身份验证,但服务主体更改为工作负载联合身份验证模型,因此我改用 WorkloadIdentityCredential 身份验证,但这要求令牌位于文件中,因此为令牌创建一个临时文件,但是有更好/更安全的方法吗?
这是最初的认证
credential = ClientSecretCredential(tenant_id = args.tenant, client_id = args.client_id, client_secret = args.client_secret)
这是我目前一直在用的
temp_token_file = "temp_token_file.txt"
with open(temp_token_file, "w") as f:
f.write(args.oidc_token)
credential = WorkloadIdentityCredential(tenant_id=args.tenant, client_id=args.client_id, token_file_path=temp_token_file)
通常,支持
WorkloadIdentityCredential
的环境(例如 Azure Kubernetes 服务)将为要使用的凭据设置/注入必要的环境变量(AZURE_AUTHORITY_HOST
、AZURE_CLIENT_ID
、AZURE_TENANT_ID
和 AZURE_FEDERATED_TOKEN_FILE
) 。文件中由 AZURE_FEDERATED_TOKEN_FILE
表示的令牌是短暂的,只能从 Azure 环境内部访问。如果您的环境支持它,那么您可以直接使用 WorkloadIdentityCredential
而不带任何参数:
from azure.identity import WorkloadIdentityCredential
credential = WorkloadIdentityCredential()
但是,由于您似乎可能在 Azure Pipelines 中运行此操作,因此通常建议您使用
AzurePipelineCredential
(前提是您已进行必要的配置)。更多信息这里,以及示例用法:
from azure.identity import AzurePipelinesCredential
service_connection_id = os.environ.get("AZURESUBSCRIPTION_SERVICE_CONNECTION_ID")
client_id = os.environ.get("AZURESUBSCRIPTION_CLIENT_ID")
tenant_id = os.environ.get("AZURESUBSCRIPTION_TENANT_ID")
system_access_token = os.environ.get("SYSTEM_ACCESSTOKEN")
if service_connection_id and client_id and tenant_id and system_access_token:
credential = AzurePipelinesCredential(
tenant_id=tenant_id,
client_id=client_id,
service_connection_id=service_connection_id,
system_access_token=system_access_token,
)