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

通过托管身份连接ASP.NET Core Web API到Azure SQL Server遇登录失败

解决方案:ASP.NET Core 托管身份连接 Azure SQL 登录失败问题

核心冲突说明

Authentication = Active Directory Default 连接字符串参数与手动设置 AccessToken 是互斥的,不能同时使用,这是你遇到第一个报错的直接原因。下面分场景给出正确配置方式,并排查潜在问题:


一、正确配置方案(二选一)

场景1:使用连接字符串自动认证(推荐,无需手动处理令牌)

保留连接字符串中的 Authentication = Active Directory Default,无需在代码中手动设置 AccessToken:

"ConnectionStrings": {
  "AzureSqlConnection": "Server=tcp:blahblah.database.windows.net;Database=My DB;Authentication=Active Directory Default;"
}

DbContext 直接使用连接字符串即可,驱动会自动根据环境获取身份令牌:

public class MyDbContext : DbContext
{
    private readonly IConfiguration _config;

    public MyDbContext(IConfiguration config) => _config = config;

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(_config.GetConnectionString("AzureSqlConnection"));
    }
}
  • App Service 环境:驱动自动识别系统分配托管身份,无需额外配置;
  • 本地开发环境:自动使用当前登录 Azure 的身份(如 Azure CLI 登录账户、Visual Studio 绑定账户)。

场景2:手动获取并设置 AccessToken(自定义令牌逻辑时使用)

移除连接字符串中的 Authentication 参数:

"ConnectionStrings": {
  "AzureSqlConnection": "Server=tcp:blahblah.database.windows.net;Database=My DB;"
}

通过 Azure.Identity 库手动获取令牌并设置:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    var connString = _config.GetConnectionString("AzureSqlConnection");
    var connection = new SqlConnection(connString);
    
    // 使用默认凭据获取 SQL 服务令牌
    var credential = new DefaultAzureCredential();
    var token = credential.GetToken(new TokenRequestContext(new[] { "https://database.windows.net/.default" }));
    connection.AccessToken = token.Token;

    optionsBuilder.UseSqlServer(connection);
}

二、关键排查步骤

1. 验证托管身份名称与 SQL 用户匹配

系统分配托管身份的名称等于你的 App Service 名称,确保 SQL 中创建用户时的名称完全一致:

-- 替换为你的 App Service 名称,注意大小写和空格
CREATE USER [你的AppService名称] FROM EXTERNAL PROVIDER;

2. 确认 AD 管理员权限生效

  • 确保 grp-sqladmin 是 Azure AD 安全组(不能是邮件组);
  • 托管身份已成功加入该组,且 SQL 服务器的 AD 管理员已设置为该组;
  • 组权限同步需要时间,若刚配置,等待5-10分钟再测试。

3. 本地开发额外检查

  • 本地登录的 Azure 账户(az login 或 VS 账户)必须在 grp-sqladmin 组中;
  • 若用个人账户连接,需在 SQL 中创建对应用户:
    CREATE USER [你的Azure账户邮箱] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [你的Azure账户邮箱];
    -- 按需添加其他角色
    

4. 防火墙规则检查

  • 本地开发:将本地 IP 添加到 SQL 服务器防火墙允许列表;
  • App Service:在 SQL 防火墙中开启“允许 Azure 服务和资源访问此服务器”选项。

5. 依赖包版本验证

确保项目中 Microsoft.Data.SqlClient 和 Azure.Identity 是最新稳定版,旧版本可能存在身份认证兼容性问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:32:17