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

ASP.NET Web API用EF Code-First连接Azure SQL遇登录失败及主库连接错误

解决非.NET Core ASP.NET Web API连接Azure SQL的登录异常问题

异常现象

  • System.Data.SqlClient.SqlException: 登录失败,用户为空。
  • InvalidOperationException: 此操作需要连接'master'数据库。由于原始数据库连接已打开且凭据已从连接字符串中移除,无法创建'master'数据库连接,请提供未打开的连接。

问题根源

  1. 连接字符串缺少必要配置,且EF初始化时连接已被自动打开,导致设置AccessToken的时机太晚无法生效
  2. EF尝试访问master数据库做初始化操作时,已打开的连接未携带有效凭据,且无法创建新的认证连接

解决方案

1. 调整Web.config连接字符串

添加MultipleActiveResultSets=True参数,确保连接支持多结果集,同时不包含用户名密码(依赖托管身份认证):

<connectionStrings>
  <add name="YourContextName" connectionString="Server=tcp:xxxxx.database.windows.net,1433;Database=xxx;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>

2. 修改DbContext的Token设置逻辑

确保在连接打开前设置AccessToken,避免EF提前触发连接打开:

public TestDBContext() : base("name=YourContextName")
{
    // 强制关闭已打开的连接,确保设置Token时连接处于未激活状态
    if (Database.Connection.State != System.Data.ConnectionState.Closed)
    {
        Database.Connection.Close();
    }

    var conn = (System.Data.SqlClient.SqlConnection)Database.Connection;
    var credential = new Azure.Identity.DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = "xxxxxxxxxxxx" });
    var token = credential.GetToken(new Azure.Core.TokenRequestContext(new[] { "https://database.windows.net/.default" }));
    conn.AccessToken = token.Token;
}

更推荐的方式是通过自定义DbConfiguration统一处理连接创建,确保每次新建连接都自动附加Token:

public class AzureSqlDbConfig : DbConfiguration
{
    public AzureSqlDbConfig()
    {
        SetProviderServices("System.Data.SqlClient", SqlProviderServices.Instance);
        SetDefaultConnectionFactory(new SqlConnectionFactory(connectionString =>
        {
            var sqlConn = new SqlConnection(connectionString);
            var cred = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = "xxxxxxxxxxxx" });
            var token = cred.GetToken(new TokenRequestContext(new[] { "https://database.windows.net/.default" }));
            sqlConn.AccessToken = token.Token;
            return sqlConn;
        }));
    }
}

然后在DbContext上应用该配置:

[DbConfigurationType(typeof(AzureSqlDbConfig))]
public class TestDBContext : DbContext
{
    public TestDBContext() : base("name=YourContextName")
    {
    }

    // 定义你的DbSet
}

3. 确认托管身份权限

确保应用服务使用的用户分配托管身份(对应配置的ManagedIdentityClientId)已被授予:

  • 目标Azure SQL数据库的db_datareader/db_datawriter(或所需业务权限)
  • master数据库的public角色权限(解决EF初始化时访问master库的权限问题)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:33:24