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

使用MongoClientSettings连接MongoDB时认证失败求助

解决方案:添加DirectConnection = true到MongoClientSettings

在你的MongoClientSettings配置中加入DirectConnection = true,应该能解决这个认证失败的问题:

public MongoDbContext(AppSettings appSettings)
{
    var credentials = MongoCredential.CreateMongoCRCredential(databaseName: "myDatabaseName", username: "myUsername", password: "myPassword");
    var server = new MongoServerAddress(host: "myDomain.com", port: 27017);
    var mongoClientSettings = new MongoClientSettings
    {
        Credential = credentials,
        Server = server,
        ConnectionMode = ConnectionMode.Standalone,
        DirectConnection = true, // 新增这一行配置
        ServerSelectionTimeout = TimeSpan.FromSeconds(3)
    };
    _client = new MongoClient(mongoClientSettings);
    // ...
}

原因分析

你使用的MongoDB .NET Driver 2.6.1属于早期版本,即使设置了ConnectionMode = ConnectionMode.Standalone,驱动默认还是会尝试执行拓扑发现(检查是否存在副本集或分片集群)。这个过程会干扰独立实例的认证流程,导致认证请求没有被正确处理,最终触发超时和认证失败的报错。

而通过连接字符串方式连接时,驱动会自动为独立实例开启DirectConnection = true,跳过拓扑发现步骤,所以认证能正常完成。

其他排查方向

如果添加DirectConnection后问题仍存在,可以试试这些方法:

  1. 显式指定认证机制
    明确使用MongoDB 3.6默认支持的SCRAM-SHA-1机制创建凭证:

    var credentials = MongoCredential.CreateCredential(
        databaseName: "myDatabaseName",
        username: "myUsername",
        password: "myPassword",
        mechanism: MongoAuthenticationMechanism.ScramSha1);
    
  2. 对比自动解析的连接配置
    通过连接字符串生成自动配置,和你的手动配置对比,找出遗漏的参数:

    var connectionString = "mongodb://myUsername:myPassword@myDomain.com:27017/myDatabaseName";
    var autoSettings = MongoClientSettings.FromConnectionString(connectionString);
    // 调试输出autoSettings的所有属性,和你的手动设置逐一比对
    
  3. 升级驱动补丁版本
    MongoDB .NET Driver 2.6.1发布于2018年,虽然官方声称兼容MongoDB 3.6,但可能存在一些已知的小bug。可以考虑升级到2.6.x分支的最新补丁版本(比如2.6.10),该版本仍兼容ASP.NET Core 2。

内容的提问来源于stack exchange,提问作者Ingmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:38:57