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

Azure Function使用托管标识认证失败(错误404:资源未找到)

Azure Function托管标识访问Azure SQL时404令牌获取失败问题

我正尝试配置Azure Function,使其通过托管标识访问Azure SQL数据库。已按照官方步骤为Function App启用系统分配的托管标识,并为该标识授予数据库的db_datareader权限。

当前配置情况

  • Azure Function部署在消耗计划中
  • Function App已启用系统分配托管标识
  • SQL Server防火墙规则允许Azure服务访问

代码实现

var credential = new DefaultAzureCredential();
var sqlConnection = new SqlConnection(new SqlConnectionStringBuilder
{
    DataSource = "myserver.database.windows.net",
    InitialCatalog = "mydatabase",
    Authentication = SqlAuthenticationMethod.ActiveDirectoryManagedIdentity
}.ToString());

sqlConnection.AccessToken = credential.GetToken(
    new TokenRequestContext(new[] { "https://database.windows.net/.default" })
).Token;

await sqlConnection.OpenAsync();

运行错误

Error: 404 Resource Not Found: Could not retrieve token from Managed Identity. Ensure the resource is properly assigned.

已排查内容

  • 托管标识已在Function App的标识设置中显示
  • SQL Server日志未记录任何连接尝试
  • 已确认Function App对SQL数据库拥有足够权限

解决建议

  1. 移除手动令牌获取逻辑
    当连接字符串指定Authentication = SqlAuthenticationMethod.ActiveDirectoryManagedIdentity时,SqlConnection会自动调用托管标识服务获取令牌,手动设置AccessToken会导致认证逻辑冲突。简化代码如下:

    var sqlConnection = new SqlConnection(new SqlConnectionStringBuilder
    {
        DataSource = "myserver.database.windows.net",
        InitialCatalog = "mydatabase",
        Authentication = SqlAuthenticationMethod.ActiveDirectoryManagedIdentity
    }.ToString());
    
    await sqlConnection.OpenAsync();
    
  2. 验证数据库权限映射
    确认托管标识的服务主体已正确映射到SQL数据库用户,并拥有db_datareader权限。可通过以下步骤检查:

    • 复制Function App系统分配标识的对象ID
    • 在SQL数据库中执行查询:
      SELECT name, type_desc FROM sys.database_principals WHERE sid = CONVERT(varbinary(16), '<对象ID>', 1);
      

    若未找到对应用户,需重新执行创建用户并授权的脚本:

    CREATE USER [FunctionApp标识名称] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [FunctionApp标识名称];
    
  3. 排查消耗计划环境问题
    消耗计划下的Function App可能因实例冷启动或网络隔离导致令牌获取失败,尝试:

    • 重启Function App实例
    • 临时切换到弹性计划测试是否解决问题,排除环境限制
  4. 确认托管标识状态
    进入Function App的“标识”页面,确认系统分配标识状态为已启用,且未被意外禁用或删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:56:07