Semantic Kernel Python 调整 Azure 认证:1.36.0 移除 DefaultAzureCredential 默认回退

在早期版本的 Semantic Kernel Python 中,像 AzureChatCompletion 这样的 Azure 服务默认会使用 Azure Identity 库里的 DefaultAzureCredential 作为回退认证机制。这个机制在不显式传入凭据时也能完成认证,尤其在开发阶段非常方便。不过,最新的 1.36.0 版本正在移除这一回退机制,以鼓励更安全、更明确的认证实践。如果你的代码依赖了这一默认行为,升级后可能会遇到错误,并且需要做一些小幅代码调整,才能继续使用基于凭据的认证。
本文将说明这项变更背后的原因、你可能遇到的问题,以及如何更新代码。关于 Azure 认证方式的更多细节,可参考 Azure Identity library documentation。
为什么需要这项变更
DefaultAzureCredential 主要是为本地开发环境设计的。它会按顺序尝试一组常见的开发者凭据(例如 Azure CLI、Azure PowerShell、Visual Studio Code 登录态),直到成功为止,从而简化认证流程。虽然这很适合快速原型开发,但在生产环境中会带来一些风险和限制:
- 行为不可预测: 它会依次尝试多种认证方式,可能导致延迟、意外失败,或者依赖那些在不同环境中并不稳定可用的凭据。
- 交互式认证回退: 默认情况下,它可能触发基于浏览器的交互式登录,这不适合在服务器或云环境中运行的自动化、无界面(headless)生产应用。
- 安全性与最佳实践: 生产场景更适合使用显式、专用的凭据,例如托管身份(managed identities)或服务主体(service principals),这样在控制、审计与安全性方面更可控。像
DefaultAzureCredential这种宽泛回退机制可能掩盖配置问题,也不符合最小权限原则。
基于以上原因,我们建议在生产中根据部署环境选择更有针对性的凭据类型,以确保可靠性和安全性。
最新版本中的变更与潜在报错
从新 SDK 版本开始,隐式使用 DefaultAzureCredential 作为回退机制已被移除。这意味着如果代码没有显式提供认证方式(例如 API key、AD token 或 credential 对象),初始化将失败。
此前依赖默认回退的用户在升级后,可能会看到 ServiceInitializationError,错误信息为:Please provide either api_key, ad_token, ad_token_provider, credential or a client. 这表示 SDK 现在要求你在创建服务时显式传入受支持的认证选项之一。
这项变更通过让认证显式化,减少隐藏依赖,并与 Azure 安全指南保持一致,从而推动更好的编码实践。
如何更新你的代码
要解决这个问题,你需要更新代码并显式传入认证方式。如果你希望继续使用“基于凭据”的方案(类似之前的回退机制),可以从 Azure Identity 库实例化一个具体凭据类型,并传给服务构造函数。
例如,从旧的隐式回退:
chat_service = AzureChatCompletion()
改为显式凭据,比如 AzureCliCredential(或者根据场景使用其他类型,如适用于 Azure 托管应用的 ManagedIdentityCredential):
from azure.identity import AzureCliCredential
chat_service = AzureChatCompletion(credential=AzureCliCredential()) # Or use another credential type
其他可选方式还包括传入 api_key、ad_token、ad_token_provider,或者一个预配置好的 client。请根据你的运行环境选择最合适的方案。
同时别忘了从 azure.identity 导入所需凭据类,并确保运行环境已完成对应配置(例如使用 AzureCliCredential 时需先登录 Azure CLI)。
总结
Semantic Kernel Python 的这次更新移除了 DefaultAzureCredential 回退机制,目的是推动显式且更安全的认证方式,在保留灵活性的同时解决生产环境潜在问题。只需做一处小幅代码调整,你就可以避免初始化错误,并与最佳实践保持一致。
我们也一直希望听到你的声音。如果你有反馈、问题,或希望进一步讨论,欢迎在 GitHub 的 discussion boards 与我们和社区交流!如果你喜欢 Semantic Kernel,也欢迎在 GitHub 给我们点个 star。
Category
Author

高级软件工程师

