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

如何通过REST API或Python SDK用Azure服务主体创建删除另一服务主体密钥

服务主体密钥创建/删除Python实现方案

前置准备

首先需要给作为操作凭证的第一个服务主体配置足够的操作权限:

  • 进入Azure Portal的Azure Active Directory管理页面,找到第一个服务主体对应的应用注册条目
  • 进入「API权限」标签页,添加Microsoft Graph的应用权限 Application.ReadWrite.All
  • 点击「授予管理员同意」完成权限生效,未完成同意的权限无法正常调用接口

然后安装所需依赖包:

pip install azure-identity requests

核心实现代码

注意:操作第二个服务主体时需要用到它的对象ID,可在其应用注册概述页获取,不是客户端/应用ID

from azure.identity import ClientSecretCredential
import requests
from datetime import datetime, timedelta

# 基础配置参数
TENANT_ID = "第一个服务主体所属的租户ID"
# 第一个服务主体(凭证用)的信息
FIRST_SP_CLIENT_ID = "第一个服务主体的客户端ID"
FIRST_SP_CLIENT_SECRET = "第一个服务主体的客户端密钥"
# 第二个服务主体(要操作的目标)的信息
SECOND_SP_OBJECT_ID = "第二个服务主体的对象ID"

# 初始化凭证,获取Graph API访问token
credential = ClientSecretCredential(
    tenant_id=TENANT_ID,
    client_id=FIRST_SP_CLIENT_ID,
    client_secret=FIRST_SP_CLIENT_SECRET,
    scope=["https://graph.microsoft.com/.default"]
)
access_token = credential.get_token("https://graph.microsoft.com/.default").token
headers = {
    "Authorization": f"Bearer {access_token}",
    "Content-Type": "application/json"
}

def create_second_sp_secret(expire_days=730):
    """
    为第二个服务主体创建新的客户端密钥
    :param expire_days: 密钥有效期,默认2年(730天)
    :return: 生成的密钥信息,包含明文密钥值(仅返回一次)
    """
    create_url = f"https://graph.microsoft.com/v1.0/applications/{SECOND_SP_OBJECT_ID}/addPassword"
    payload = {
        "passwordCredential": {
            "displayName": "自动创建的服务主体密钥", # 可自定义密钥名称
            "endDateTime": f"{(datetime.utcnow() + timedelta(days=expire_days)).isoformat()}Z"
        }
    }
    
    resp = requests.post(create_url, headers=headers, json=payload)
    resp.raise_for_status()
    return resp.json()

def delete_second_sp_secret(secret_key_id):
    """
    删除第二个服务主体下指定的客户端密钥
    :param secret_key_id: 要删除的密钥的keyId,可通过查询服务主体信息获取
    """
    delete_url = f"https://graph.microsoft.com/v1.0/applications/{SECOND_SP_OBJECT_ID}/removePassword"
    payload = {
        "keyId": secret_key_id
    }
    resp = requests.post(delete_url, headers=headers, json=payload)
    resp.raise_for_status()
    return "删除成功"

# 示例调用
if __name__ == "__main__":
    # 创建密钥
    new_secret = create_second_sp_secret()
    print("新生成的密钥值(仅显示一次,请及时保存):", new_secret["secretText"])
    print("新密钥的keyId:", new_secret["keyId"])
    
    # 删除密钥(示例,传入要删除的keyId即可)
    # delete_result = delete_second_sp_secret("要删除的密钥的keyId")
    # print(delete_result)

注意事项

  • 新创建的密钥明文仅会在创建接口返回时展示一次,后续无法再通过接口查询,请创建后立即保存
  • 如果需要查询目标服务主体下已有的所有密钥信息,调用GET接口https://graph.microsoft.com/v1.0/applications/{SECOND_SP_OBJECT_ID},返回结果的passwordCredentials字段即为所有密钥的信息(不含明文)
  • 密钥有效期最长建议设置为2年,不推荐设置无过期时间的密钥
  • 若接口返回403错误,优先检查第一个服务主体的Application.ReadWrite.All权限是否已经授予管理员同意

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:57:02