通过托管身份连接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
相关产品推荐
相关产品推荐

