无法通过Azure Active Directory连接SQL Server数据库的问题求助
问题解答
1. 现有TestConnection1代码的问题
你的代码核心错误是获取令牌时指定了错误的资源URI:
你使用了https://management.azure.com作为认证目标,这是Azure管理API的资源,而SQL Server Azure AD认证需要的资源是https://database.windows.net/(适用于ADAL库)。这导致你获取的令牌无法被SQL Server识别,从而抛出"Login failed for user ''."的错误。
修正后的ADAL版本代码(注意:ADAL已被官方弃用,推荐使用MSAL):
public static void TestConnection1(IConfiguration config) { ClientCredential cc = new ClientCredential(clientId, "secretValue"); // 替换为SQL Server的资源URI var context = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId); var result = context.AcquireTokenAsync("https://database.windows.net/", cc).Result; var accessToken = result.AccessToken; var sqlConnectionString = GetConnectionString(config); // 确保连接字符串中没有包含User ID/Password这类SQL认证参数 using var connection = new SqlConnection(sqlConnectionString) { AccessToken = accessToken }; connection.Open(); }
2. 推荐使用MSAL + DefaultAzureCredential
DefaultAzureCredential是更推荐的方式,它支持本地开发(Azure CLI、Visual Studio认证)和生产环境(托管标识、服务主体)的多种认证方式,无需硬编码密钥。
关键要点:
- Scope参数:需要传入
https://database.windows.net/.default,这是SQL Server的默认scope,用于获取数据库访问令牌。 - ClientId/TenantId配置:
可以通过appsettings.json配置:
然后在代码中通过{ "AzureAd": { "ClientId": "你的应用注册ID", "TenantId": "你的租户ID" } }DefaultAzureCredentialOptions加载:var credentialOptions = new DefaultAzureCredentialOptions { ClientId = config["AzureAd:ClientId"], TenantId = config["AzureAd:TenantId"] }; var defaultCredential = new DefaultAzureCredential(credentialOptions); // 请求SQL Server的令牌 var token = defaultCredential.GetToken( new TokenRequestContext(new[] { "https://database.windows.net/.default" }) ).Token; // 后续连接SQL Server的逻辑 var sqlConnectionString = GetConnectionString(config); using var connection = new SqlConnection(sqlConnectionString) { AccessToken = token }; connection.Open();
3. 必要的前置配置
除了代码修正,还需要确保:
- 你的Azure SQL Server已启用Azure AD认证,并设置了Azure AD管理员。
- 你的应用注册(服务主体)已被授予数据库访问权限:
连接到SQL Server(使用AAD管理员账号),执行以下SQL:-- 创建服务主体对应的数据库用户 CREATE USER [你的应用注册显示名称] FROM EXTERNAL PROVIDER; -- 赋予读写权限,可根据需求调整 ALTER ROLE db_datareader ADD MEMBER [你的应用注册显示名称]; ALTER ROLE db_datawriter ADD MEMBER [你的应用注册显示名称]; - 确保你的连接字符串中不包含传统SQL认证的User ID/Password参数,否则会优先使用SQL认证而非Azure AD令牌。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

