如何通过AAD应用程序以编程方式执行Kusto查询
问题分析与解决方案
为什么你的代码会使用个人用户信息执行查询
你当前代码里的DefaultAzureCredential会按优先级尝试多种凭据来源,在本地开发环境下,它会优先调用你本地已登录的身份(比如Visual Studio、Azure CLI中的个人账号),因此才会用你的用户信息执行查询。
如何通过AAD应用程序运行Kusto查询
仅靠应用ID无法完成身份验证,AAD需要验证应用的合法身份,必须结合以下无密钥验证方式之一,同时需要Kusto管理员给该AAD应用分配对应权限(无需修改AAD的API权限,仅需在Kusto集群/数据库层面配置权限):
方式1:使用托管标识(适合Azure部署的应用)
如果你的代码部署在Azure服务(如App Service、VM、Function App)上,可给该服务启用系统分配托管标识:
- 在Azure门户找到目标服务,进入「标识」选项卡,启用系统分配标识
- 联系Kusto管理员,在目标集群/数据库上给这个托管标识分配权限,示例命令:
.add database <数据库名> viewers ('aadapp=<托管标识的对象ID>') - 修改代码,无需手动获取令牌,
DefaultAzureCredential会自动获取托管标识的令牌:const string Cluster = "<ClusterName>"; const string Database = "<Database>"; const string Query = "<你的查询语句>"; DefaultAzureCredential credential = new DefaultAzureCredential(); KustoConnectionStringBuilder builder = new KustoConnectionStringBuilder($"{Cluster}/{Database}") .WithAadManagedIdentityAuthentication(credential); var adminProvider = KustoClientFactory.CreateCslAdminProvider(builder); IDataReader dataReader = adminProvider.ExecuteControlCommand(Query);
方式2:使用证书(适合本地开发或独立应用)
如果是本地运行代码,可通过证书验证AAD应用身份:
- 自行生成证书,将公钥提供给AAD管理员,由其上传到应用注册中
- 联系Kusto管理员给该AAD应用分配目标数据库的权限
- 修改代码,用证书获取身份令牌:
const string Cluster = "<ClusterName>"; const string Database = "<Database>"; const string ClientId = "<你的AAD应用ID>"; const string CertificatePath = "<本地证书路径>"; const string CertificatePassword = "<证书密码>"; const string Query = "<你的查询语句>"; X509Certificate2 cert = new X509Certificate2(CertificatePath, CertificatePassword); KustoConnectionStringBuilder builder = new KustoConnectionStringBuilder($"{Cluster}/{Database}") .WithAadApplicationCertificateAuthentication(cert, ClientId); var adminProvider = KustoClientFactory.CreateCslAdminProvider(builder); IDataReader dataReader = adminProvider.ExecuteControlCommand(Query);
注意事项
- 无论采用哪种方式,都需要Kusto管理员在集群/数据库层面给AAD应用(或托管标识)分配对应权限(如Viewer、Editor等),此操作无需修改AAD的API权限
- 若既没有密钥,也无法协调管理员配置托管标识或证书,暂时无法以纯AAD应用身份执行查询,只能继续使用用户身份,但可通过指定
DefaultAzureCredential的参数限制凭据来源,避免自动调用个人账号
内容的提问来源于stack exchange,提问作者Sravani
相关产品推荐
相关产品推荐

