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

无法通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:05:26