获取Azure Access Token的最佳实践及部署环境获取失败问题咨询
Azure 获取Access Token 最佳实践
问题根因
你当前使用的AzureServiceTokenProvider来自已停止维护的Microsoft.Azure.Services.AppAuthentication库,本地能正常运行是因为库默认读取了Visual Studio的登录凭证,部署环境不存在该登录上下文,也没有配置其他可用认证源时就会抛出异常。
行业通用最佳实践
1. 统一使用Azure.Identity库替换旧认证库
Azure官方现在推荐用Azure.Identity作为唯一的身份认证SDK,适配所有本地、云端部署场景,不需要针对不同环境修改业务代码:
- 本地开发阶段:自动依次尝试读取Visual Studio、VS Code、Azure CLI、PowerShell的登录凭证,和你之前的本地使用体验完全一致
- 云端部署阶段:自动读取托管标识凭证,不需要手动维护任何密钥
- 非Azure部署阶段:自动读取环境变量配置的服务主体信息、本地Azure CLI登录凭证等认证源
示例代码如下:
using Azure.Core; using Azure.Identity; // 初始化凭证,可通过选项指定租户ID、排除不需要的认证流 var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { TenantId = "替换为你的租户ID" }); // 异步请求访问令牌,作用域按需替换为目标API的资源标识 var accessToken = await credential.GetTokenAsync( new TokenRequestContext(new[] { "https://management.azure.com/.default" }) ); string token = accessToken.Token;
注意:尽量避免用.Result同步调用异步方法,容易引发线程死锁,必须同步获取时直接调用同步方法GetToken即可
2. 部署环境适配方案
- 部署到Azure官方服务(App Service、Function、VM、AKS等):优先使用托管标识,给对应服务的系统分配/用户分配托管标识授予目标API的访问权限即可,不需要任何额外代码或配置修改
- 部署到非Azure环境:
- 方案1:创建服务主体,将租户ID、客户端ID、客户端密钥/证书配置到进程的环境变量中,
DefaultAzureCredential会自动读取完成认证 - 方案2:部署环境安装Azure CLI,登录有权限的服务账号,
DefaultAzureCredential会自动读取CLI的登录上下文完成认证
- 方案1:创建服务主体,将租户ID、客户端ID、客户端密钥/证书配置到进程的环境变量中,
3. 旧库临时兼容方案
如果暂时无法迁移到Azure.Identity,可以给部署环境配置AzureServicesAuthConnectionString环境变量,填入服务主体的认证信息,旧版AzureServiceTokenProvider也能正常读取凭证拿到令牌,不过仍然建议尽快迁移到新库,旧库已经不再接收功能更新和安全补丁。
内容的提问来源于stack exchange,提问作者user17401135
相关产品推荐
相关产品推荐

