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

Azure Functions V4 .NET 7编程获取默认密钥遇认证异常求助

问题描述

我在以编程方式获取Azure Functions密钥时遇到了问题。我知道可以使用Environment.GetEnvironmentVariable,但这意味着每次更新密钥时都要手动修改配置。此外,目前我无法使用任何类型的身份验证提供商(Microsoft、Google等)。我已在本地通过以下代码实现功能,但部署到Azure后出现了EnvironmentCredential认证异常。是否有替代方法或如何修改现有代码实现目标?

var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
var subscription = await armClient.GetDefaultSubscriptionAsync();
var webSitesEnumerator = subscription.GetWebSitesAsync().GetAsyncEnumerator();
try
{
    while (await webSitesEnumerator.MoveNextAsync())
    {
        var webSite = webSitesEnumerator.Current;
        var hostKeys = await webSite.GetHostKeysAsync();
        var defaultKeyItem = hostKeys.Value.FunctionKeys.FirstOrDefault(x => x.Key == DefaultKey);
        return defaultKeyItem.Value;
    }
}
finally
{
    await webSitesEnumerator.DisposeAsync();
}

错误信息如下:

Result: Exception when Authenticating User.Exception: Azure.Identity.CredentialUnavailableException: DefaultAzureCredential failed to retrieve a token from the included credentials. See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/defaultazurecredential/troubleshoot
  • EnvironmentCredential认证不可用。环境变量未完全配置。
解决方案

方法一:使用Azure Functions托管标识(推荐)

部署到Azure环境时,优先通过托管标识解决认证问题:

  1. 为你的Azure Functions应用启用系统分配托管标识:
    • 进入Azure Portal的Functions应用页面,找到「标识」选项卡,切换到「系统分配」标签,将状态设置为「开启」并保存。
  2. 为托管标识分配权限:
    • 定位到Functions应用所属资源组或直接选中该应用资源,在「访问控制(IAM)」中添加角色分配,给托管标识分配网站参与者或Functions应用 Contributor角色,确保它拥有读取函数密钥的权限。
  3. 代码无需大幅修改:
    • DefaultAzureCredential会自动在Azure环境中优先调用托管标识,部署后无需额外配置环境变量即可正常认证。

方法二:使用本地配置文件(仅适用于测试场景)

如果暂时无法使用托管标识,可考虑将密钥写入配置文件打包部署(不建议生产环境使用):

  • 在项目中创建包含函数密钥的配置文件(如自定义的appsettings.production.json),部署时将文件纳入发布包,同时做好文件权限管控防止密钥泄露。
  • 代码中直接读取该配置文件内容获取密钥,但这种方式仍需在密钥更新时重新部署。

方法三:调整DefaultAzureCredential认证优先级(可选)

若环境中有其他可用认证方式(如Azure CLI缓存凭据,生产环境不推荐),可修改配置跳过EnvironmentCredential:

var options = new DefaultAzureCredentialOptions
{
    ExcludeEnvironmentCredential = true,
    // 可根据需求添加其他排除项,比如ExcludeVisualStudioCredential等
};
var credential = new DefaultAzureCredential(options);
// 后续代码保持不变

错误核心原因

出现CredentialUnavailableException是因为DefaultAzureCredential在Azure环境中找不到可用的认证方式。托管标识是Azure服务间认证的标准方案,配置后既能解决认证问题,又能避免手动维护密钥的繁琐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:45:12