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

Python使用ClientSecretCredential授权Azure报未授权错误求助

错误定位

你的代码报401未授权和environ模块没有关系,核心问题有4个:

  • Key Vault地址拼接错误:你当前使用的后缀.scm.azurewebsites.net是Azure应用服务的部署管理站点域名,和Key Vault服务完全无关。Key Vault的标准域名后缀是vault.azure.net,正确URI格式为https://<你的Key Vault名称>.vault.azure.net。
  • 环境变量读取逻辑无兜底:env.get("myapp")会读取系统环境变量中名为myapp的值,如果环境变量未配置,返回值为None,最终拼接出的URI是无效地址。os.environ不是认证必须的依赖,你完全可以直接把Key Vault名称写在代码里,或者和其他凭据一起存在cred.json中读取。
  • 本地凭据文件路径书写错误:原代码中路径C:Project\cred.json缺少盘符后的反斜杠,Windows下正确路径应为C:\Project\cred.json,如果路径读取失败也会触发异常。
  • 服务主体权限未配置:就算地址写对,你使用的client_id对应的Azure AD应用(服务主体),必须提前在目标Key Vault上配置密钥读取权限,否则请求会被服务端直接拒绝返回401。
仅用三类凭据实现无用户名密码授权的可行方案

以下代码完全不依赖交互式用户名密码登录,仅通过tenant_id、client_id、client_secret三个参数完成服务主体认证,符合你的需求:

import json
from azure.identity import ClientSecretCredential
from azure.keyvault.secrets import SecretClient

# 读取本地存储的凭据
with open(r'C:\Project\cred.json') as data_file:
    data = json.load(data_file)

TENANT_ID = data["tenant_id"]
CLIENT_ID = data["client_id"]
CLIENT_SECRET = data["client_secret"]

# 替换为你实际的Key Vault名称,不需要依赖环境变量
KEYVAULT_NAME = "替换为你的Key Vault实例名称"
KEYVAULT_URI = f"https://{KEYVAULT_NAME}.vault.azure.net"

# 初始化服务主体凭据,全程无交互式登录
credential = ClientSecretCredential(
    tenant_id=TENANT_ID,
    client_id=CLIENT_ID,
    client_secret=CLIENT_SECRET
)

# 初始化Key Vault密钥客户端
secret_client = SecretClient(vault_url=KEYVAULT_URI, credential=credential)

# 读取存储的密钥值
DEMO_DB_USERNAME = secret_client.get_secret("DemoUserName").value
DEMO_DB_PASSWORD = secret_client.get_secret("DemoUserPassword").value
运行前必做的配置检查
  • 确认你使用的client_secret没有过期,值和Azure AD应用注册页面中保存的一致。
  • 打开目标Key Vault的「访问控制(IAM)」页面,给当前使用的服务主体分配Key Vault Secrets User角色;如果使用经典访问策略模式,需要给该服务主体勾选「密钥获取」权限。
  • 确认你的网络可以正常访问对应Azure环境的Key Vault服务端点,没有被本地防火墙或Azure侧的IP访问限制拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:39:09