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

Azure SQL托管标识连接下使用SqlCacheDependency遇登录失败问题

解决SqlCacheDependency结合托管标识连接Azure SQL时的登录失败问题

我将C# & .NET 4.8.1应用迁移至Azure时,遇到了SqlCacheDependency无法沿用托管标识AccessToken连接数据库的问题,代码如下:

SqlConnection con = new SqlConnection("connection_string_without_user_or_password")
con.AccessToken = GetToken(); // 获取有效的托管标识令牌,连接数据库正常
con.Open()

SqlCacheDependency sqlDependency = new SqlCacheDependency(con.Database, "my_table");

运行时出现两个错误:

Unable to connect to SQL database 'MyDatabase' for cache dependency polling.
[SqlException (0x80131904): Login failed for user ''.]

问题根源是SqlCacheDependency内部会创建新的数据库连接,但没有继承原SqlConnection设置的AccessToken,而是直接使用不带用户/密码的原始连接字符串,导致登录失败。

解决方法

方法一:将AccessToken嵌入连接字符串

Azure SQL的SqlConnection支持在连接字符串中直接指定AccessToken参数,把令牌拼接进连接字符串后,SqlCacheDependency使用该连接字符串就能自动带上令牌:

var baseConnStr = "connection_string_without_user_or_password";
var accessToken = GetToken();
// 拼接包含AccessToken的完整连接字符串
var fullConnStr = $"{baseConnStr};AccessToken={accessToken}";

using (var con = new SqlConnection(fullConnStr))
{
    con.Open();
    // 此时SqlCacheDependency会使用带令牌的连接字符串创建内部连接
    var sqlDependency = new SqlCacheDependency(con.Database, "my_table");
}

// 如果项目中用到SqlDependency.Start初始化,同样传入带令牌的连接字符串
SqlDependency.Start(fullConnStr);

方法二:确保托管标识权限足够

SqlCacheDependency需要额外的数据库权限,需在Azure SQL中执行以下SQL为托管标识授权:

-- 允许查看数据库状态,用于更改跟踪
GRANT VIEW DATABASE STATE TO [你的托管标识名称];
-- 如果使用Service Broker模式的缓存依赖,需添加此权限
GRANT ALTER ANY SERVICE BROKER TO [你的托管标识名称];

注意事项

  • AccessToken存在过期时间(通常为1小时),需实现令牌刷新逻辑,在令牌过期前重新生成包含新令牌的连接字符串。
  • 确保GetToken()方法获取的令牌范围为https://database.windows.net/.default,否则无法用于Azure SQL认证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:17:34