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

使用托管身份验证Azure SQL DB时遇“登录失败”错误求解决方案

解决Azure SQL DB托管身份验证"Login failed for user ''"错误

核心问题分析

你的代码存在关键逻辑错误:你创建了SqlConnection并设置了AccessToken,但随后用该连接的原始连接字符串初始化SqlDatabase,而非直接使用已配置好令牌的SqlConnection实例。这导致SqlDatabase内部创建的新连接未携带身份验证令牌,触发空用户登录失败的错误。

解决方案步骤

1. 修正SqlDatabase初始化逻辑

直接使用已设置AccessToken的SqlConnection实例创建SqlDatabase,而非连接字符串。修改后的代码如下:

public ReturnData GetData()
{
    string connectionString = "Server=database.windows.net,1433;Initial Catalog=Mydatabase;";
    var credential = new DefaultAzureCredential();
    var token = credential.GetToken(new Azure.Core.TokenRequestContext(new[] {"https://database.windows.net/.default" }));
    
    // 创建连接并设置令牌,用using确保资源释放
    using (SqlConnection sqlConnection = new SqlConnection(connectionString))
    {
        sqlConnection.AccessToken = token.Token;
        // 直接传入SqlConnection实例,而非连接字符串
        Database database = new SqlDatabase(sqlConnection);
        
        using(DbCommand dbCommand=database.GetStoredProcCommand(DatabaseConstants.Procedure_Name))
        {
            dbCommand.CommandTimeout=3600;
            ((SqlDatabase)database).AddInParameter(dbCommand,DatabaseConstants.D_ATM, DbType.Int32, id);
            DataSet dataSet = database.ExecuteDataSet(dbCommand);  
            
            if(dataSet!=null&&dataSet.Tables.Count>0&&dataSet.Tables[0].Rows.Count > 0)
            {
                DataRow row = dataSet.Tables[0].Rows[0];
                // 此处添加数据映射等业务逻辑
            }
        }
    }
}

2. 权限配置二次验证(即使你已添加权限)

  • 确认Azure SQL DB中已正确创建托管身份对应的用户:
    -- 替换为你的托管身份名称(系统分配身份用资源名称,用户分配身份用客户端ID)
    CREATE USER [你的托管身份名称] FROM EXTERNAL PROVIDER;
    -- 赋予存储过程执行权限(按需调整)
    GRANT EXECUTE ON PROCEDURE::[DatabaseConstants.Procedure_Name] TO [你的托管身份名称];
    
  • 确认运行代码的Azure资源(如App Service、VM)已启用托管身份,且该身份被允许访问Azure SQL DB(需在SQL DB防火墙设置中允许Azure资源访问)。

3. 令牌获取逻辑优化(可选)

使用异步方法获取令牌,符合.NET最佳实践且自动处理令牌刷新:

sqlConnection.AccessToken = await credential.GetTokenAsync(
    new TokenRequestContext(new[] {"https://database.windows.net/.default"}), 
    CancellationToken.None);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:39:56