如何在C#中使用带联合凭据的服务主体连接Azure SQL
问题
现有代码通过带密钥的服务主体连接Azure SQL实例运行正常,但不清楚如何在服务主体无密钥/证书、仅关联托管标识且使用联合凭据的情况下获取AccessToken,进而连接Azure SQL。
解决方案
使用Azure官方的Azure.Identity库替代旧版ADAL(AuthenticationContext所属库),该库原生支持托管标识(含联合凭据场景)的身份验证,无需手动处理令牌获取逻辑。
前置准备
- 安装必要的NuGet包:
Install-Package Azure.Identity Install-Package Microsoft.Data.SqlClient
- 确保托管标识已关联到目标服务主体,且联合凭据配置完成;同时托管标识已被授予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
相关产品推荐
相关产品推荐

