如何使用标识对Azure Cosmos DB MongoDB API账户进行身份验证?
使用Azure AD身份验证连接Azure Cosmos DB MongoDB API(替代连接字符串)
核心思路
直接通过Azure AD获取访问令牌,将令牌作为MongoDB客户端的认证凭据,采用MONGODB-AZURE认证机制,无需依赖连接字符串。
步骤与代码示例
1. 安装依赖包
需要添加以下NuGet包:
MongoDB.Driver(2.19.0)Microsoft.Identity.Client(用于获取Azure AD令牌,建议最新稳定版)- 若使用托管标识,需安装
Azure.Identity
2. 获取Azure AD访问令牌
根据你的身份类型选择对应的令牌获取方式:
场景1:服务主体(Client Credential流)
using Microsoft.Identity.Client; public async Task<string> GetAzureAdTokenForCosmosDb() { var tenantId = "你的Azure AD租户ID"; var clientId = "服务主体Client ID"; var clientSecret = "服务主体Client Secret"; var resourceUri = "https://cosmos.azure.com/"; // Cosmos DB固定资源标识 var app = ConfidentialClientApplicationBuilder .Create(clientId) .WithClientSecret(clientSecret) .WithAuthority($"https://login.microsoftonline.com/{tenantId}") .Build(); var result = await app.AcquireTokenForClient(new[] { $"{resourceUri}/.default" }) .ExecuteAsync(); return result.AccessToken; }
场景2:托管标识(MSI,直接获取令牌)
using Azure.Core; using Azure.Identity; public async Task<string> GetMsiTokenForCosmosDb() { var resourceUri = "https://cosmos.azure.com/"; var credential = new ManagedIdentityCredential(); var tokenRequestContext = new TokenRequestContext(new[] { $"{resourceUri}/.default" }); var token = await credential.GetTokenAsync(tokenRequestContext); return token.Token; }
3. 配置MongoDB客户端并执行读写
using MongoDB.Driver; using MongoDB.Bson; public async Task ConnectWithAzureAdAuth() { var cosmosDbHost = "你的Cosmos DB账户名.mongo.cosmos.azure.com"; var databaseName = "目标数据库名"; var collectionName = "目标集合名"; // 获取Azure AD令牌 var accessToken = await GetAzureAdTokenForCosmosDb(); // 或调用托管标识的令牌方法 // 构建客户端配置 var settings = MongoClientSettings.FromUrl(new MongoUrl($"mongodb://{cosmosDbHost}:10255/")); settings.SslSettings = new SslSettings { EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12 }; settings.AuthMechanism = "MONGODB-AZURE"; settings.AuthMechanismProperties = new Dictionary<string, object> { { "ACCESS_TOKEN", accessToken } }; // 创建客户端并操作数据 var client = new MongoClient(settings); var database = client.GetDatabase(databaseName); var collection = database.GetCollection<BsonDocument>(collectionName); // 示例:插入文档 var testDoc = new BsonDocument("title", "Azure AD认证测试"); await collection.InsertOneAsync(testDoc); // 示例:查询文档 var queryResult = await collection.Find(new BsonDocument()).FirstOrDefaultAsync(); Console.WriteLine(queryResult.ToJson()); }
关键配置与权限说明
- SSL强制要求:Cosmos DB MongoDB API仅允许TLS 1.2连接,必须配置
SslSettings。 - 认证机制:必须指定
MONGODB-AZURE,并将令牌传入AuthMechanismProperties的ACCESS_TOKEN字段。 - 权限分配:需为你的Azure AD标识(服务主体/托管标识/用户)分配Cosmos DB内置角色,比如
Cosmos DB Built-in Data Contributor,确保拥有数据读写权限。
注意事项
- 访问令牌有效期为1小时,需在过期前重新获取并更新客户端配置,或每次操作前校验令牌有效性。
- MongoDB.Driver 2.19.0原生支持
MONGODB-AZURE认证机制,无需升级版本。
内容的提问来源于stack exchange,提问作者Youxu
相关产品推荐
相关产品推荐

