使用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后问题仍存在,可以试试这些方法:
显式指定认证机制
明确使用MongoDB 3.6默认支持的SCRAM-SHA-1机制创建凭证:var credentials = MongoCredential.CreateCredential( databaseName: "myDatabaseName", username: "myUsername", password: "myPassword", mechanism: MongoAuthenticationMechanism.ScramSha1);对比自动解析的连接配置
通过连接字符串生成自动配置,和你的手动配置对比,找出遗漏的参数:var connectionString = "mongodb://myUsername:myPassword@myDomain.com:27017/myDatabaseName"; var autoSettings = MongoClientSettings.FromConnectionString(connectionString); // 调试输出autoSettings的所有属性,和你的手动设置逐一比对升级驱动补丁版本
MongoDB .NET Driver 2.6.1发布于2018年,虽然官方声称兼容MongoDB 3.6,但可能存在一些已知的小bug。可以考虑升级到2.6.x分支的最新补丁版本(比如2.6.10),该版本仍兼容ASP.NET Core 2。
内容的提问来源于stack exchange,提问作者Ingmar
相关产品推荐
相关产品推荐

