使用托管身份验证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
相关产品推荐
相关产品推荐

