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

使用SSMS通过用户托管标识(UMI)连接Azure SQL Database失败求助

用户托管标识连接Azure SQL Database失败的排查与解决

关键限制说明

SSMS里的「AAD - Managed Identity」连接选项仅支持系统托管标识,用户托管标识无法通过这个选项直接连接——该选项默认调用当前环境的系统托管标识,无法指定自定义的用户托管标识,这很可能是你连接失败的核心原因。

排查与修复步骤

  • 验证DB内用户映射正确性
    执行以下SQL语句检查用户是否正确关联到你的用户托管标识:

    SELECT name, type, type_desc, authentication_type_desc FROM sys.database_principals WHERE name = 'MyUserManagedId';
    

    确认结果中type_desc为EXTERNAL_USER、authentication_type_desc为EXTERNAL。若映射错误,删除用户重新创建:

    DROP USER IF EXISTS MyUserManagedId;
    CREATE USER MyUserManagedId FROM EXTERNAL PROVIDER;
    
  • 为UMI分配SQL Server级权限
    仅拥有DB内的db_owner角色不够,需确保用户托管标识被授予访问SQL Server的权限:在Azure Portal中找到你的UMI,为其添加Azure SQL Database Contributor角色(针对目标SQL Server或其所在资源组),或更细粒度的SQL DB Contributor权限。

  • 确认SQL Server的AAD管理员已配置
    打开Azure Portal的SQL Server页面,进入「安全性」->「Azure Active Directory」,确认已设置AAD管理员。未配置AAD管理员的话,所有AAD身份验证(包括托管标识)都会失败。

正确的用户托管标识连接方式

既然SSMS的直接选项不支持,可通过以下方式实现连接:

  • PowerShell/CLI获取令牌连接
    PowerShell示例:
    $token = (Get-AzAccessToken -ResourceUrl https://database.windows.net/).Token
    sqlcmd -S your-sql-server.database.windows.net -d your-db -G -U "MyUserManagedId" -P $token
    
  • 代码实现连接
    以C#为例,通过获取UMI访问令牌设置连接字符串:
    var tokenProvider = new AzureServiceTokenProvider("RunAs=App;AppId=你的UMI应用ID");
    string token = await tokenProvider.GetAccessTokenAsync("https://database.windows.net/");
    using var conn = new SqlConnection("Server=your-sql-server.database.windows.net;Database=your-db;");
    conn.AccessToken = token;
    await conn.OpenAsync();
    
  • Azure资源内部连接
    若在VM、Function App等Azure资源中使用UMI,先给资源分配该UMI,代码中可直接用托管标识连接(SDK会自动处理令牌获取)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:42:46