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

如何在C#中使用带联合凭据的服务主体连接Azure SQL

问题

现有代码通过带密钥的服务主体连接Azure SQL实例运行正常,但不清楚如何在服务主体无密钥/证书、仅关联托管标识且使用联合凭据的情况下获取AccessToken,进而连接Azure SQL。

解决方案

使用Azure官方的Azure.Identity库替代旧版ADAL(AuthenticationContext所属库),该库原生支持托管标识(含联合凭据场景)的身份验证,无需手动处理令牌获取逻辑。

前置准备

  1. 安装必要的NuGet包:
Install-Package Azure.Identity
Install-Package Microsoft.Data.SqlClient
  1. 确保托管标识已关联到目标服务主体,且联合凭据配置完成;同时托管标识已被授予Azure SQL的访问权限(如Azure AD管理员、db_datareader角色等)。

示例代码

using Azure.Identity;
using Microsoft.Data.SqlClient;
using System.Collections.Generic;
using System.Threading.Tasks;

// 替换为你的实际配置
var sqlServerName = "your-sql-server-name.database.windows.net";
var sqlDatabaseName = "your-database-name";
var tenantId = "your-tenant-id";
// 用户分配托管标识需填写此项,系统分配可忽略
var managedIdentityClientId = "your-managed-identity-client-id";

// 构建SQL连接字符串
string sqlConnectionString = $"Data Source=tcp:{sqlServerName},1433;Initial Catalog={sqlDatabaseName};Persist Security Info=False;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False";

// 初始化凭据,自动适配托管标识+联合凭据场景
var credentialOptions = new DefaultAzureCredentialOptions
{
    TenantId = tenantId
};
// 用户分配托管标识时启用此行
// credentialOptions.ManagedIdentityClientId = managedIdentityClientId;

var credential = new DefaultAzureCredential(credentialOptions);

// 获取Azure SQL的访问令牌(资源范围需指定为https://database.windows.net/.default)
var tokenRequest = new Azure.Core.TokenRequestContext(new[] { "https://database.windows.net/.default" });
var accessToken = await credential.GetTokenAsync(tokenRequest);

List<Employee> employeeResult = new();

using (var conn = new SqlConnection(sqlConnectionString))
{
    conn.AccessToken = accessToken.Token;
    await conn.OpenAsync();

    string sampleSqlQuery = "SELECT EmployeeId, FirstName, LastName, LastUpdatedDate, SessionId FROM Employees";
    using (var cmd = new SqlCommand(sampleSqlQuery, conn))
    {
        using (var results = await cmd.ExecuteReaderAsync())
        {
            while (await results.ReadAsync())
            {
                employeeResult.Add(new Employee
                {
                    EmployeeId = results.GetInt16(0),
                    FirstName = results.GetString(1),
                    LastName = results.GetString(2),
                    LastUpdatedDate = results.GetDateTime(3),
                    SessionId = results.GetGuid(4)
                });
            }
        }
    }
}

关键说明

  • DefaultAzureCredential会自动优先使用托管标识进行身份验证,无需手动构建凭据对象;
  • 令牌请求的资源范围必须指定为https://database.windows.net/.default,这是Azure SQL的标准受众格式;
  • 若使用用户分配的托管标识,需在DefaultAzureCredentialOptions中指定ManagedIdentityClientId;系统分配的托管标识无需额外配置;
  • 旧版ADAL库已被官方弃用,推荐长期使用Azure.Identity库以获得更好的兼容性和安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:50:24