问题背景:
我在MongoLabs(mLab - https://mlab.com/)中设置了一个数据库并添加了一个非常简单的Collection。我正在使用MongoDB驱动程序尝试通过C#3.2驱动程序连接和使用此集合。
问题:
我无法通过C#驱动程序通过持续的身份验证操作连接到我的数据库,如下所示:
System.TimeoutException:使用CompositeServerSelector选择服务器30000ms后出现超时{Selectors = ReadPreferenceServerSelector {ReadPreference = {Mode = Primary,TagSets = []}},LatencyLimitingServerSelector {AllowedLatencyRange = 00:00:00.0150000}}。集群状态的客户端视图是{ClusterId:“1”,ConnectionMode:“Automatic”,类型:“Unknown”,状态:“Disconnected”,服务器:[{ServerId:“{ClusterId:1,EndPoint:”Unspecified / ds048719。 mlab.com:48719“}”,EndPoint:“未指定/ ds048719.mlab.com:48719”,状态:“已断开连接”,类型:“未知”,HeartbeatException:“MongoDB.Driver.MongoConnectionException:打开时发生异常连接到服务器.---> MongoDB.Driver.MongoAuthenticationException:无法使用sasl协议机制SCRAM-SHA-1进行身份验证.---> MongoDB.Driver.MongoCommandException:命令saslStart失败:身份验证失败。
守则:
我尝试过多种尝试验证请求的方法。目前我正在尝试简单地使用MongoClient
类,如下所示:
MongoClient client;
var connectionString = "mongodb://userNameGoesHereRemovedForSO:passwordGoesHereRemovedForSO@ds048555.mlab.com:48719/db";
client = new MongoClient(connectionString);
var database = client.GetDatabase("testDB");
var collection = database.GetCollection<string>("test");
我将非常感谢您提供有关如何成功克服此身份验证问题的任何帮助或示例。
答案 0 :(得分:11)
如果我不得不猜测,问题很可能是防火墙问题。你应该检查以下
nslookup
主机(ds048719.mlab.com)ping
主机(ds048719.mlab.com)(可能会失败,具体取决于mLab的设置)telnet
测试连接,例如telnet ds048719.mlab.com 48719
authenticationDatabase
(在您的示例中,这由/db
指定),通常为admin
,但如果您使用的话,可能是您的数据库名称共享实例。您可以在MongoDB C# Driver Docs中找到与C#驱动程序连接的文档。请务必注意以下事项:
数据库组件
数据库组件是可选的,用于指示要对哪个数据库进行身份验证。如果未提供数据库组件,则使用“admin”数据库。
mongodb://host:27017/mydb
上面,名为“mydb”的数据库是为应用程序存储凭据的位置。
注意:强>
某些驱动程序利用数据库组件来指示默认使用哪个数据库。 .NET驱动程序在解析数据库组件时,不会将数据库组件用于除身份验证之外的任何其他操作。
最后,我建议将来在发布到SO时模糊主机名和端口。虽然通过默默无闻的安全性是一个糟糕的政策,但它肯定会为您的MongoDB部署增加一层防御。
答案 1 :(得分:1)
您的连接字符串可能不正确。你最后有/ db,是&#34; db&#34;您的身份验证数据库的名称?
确保您的身份验证数据库正确无误。如果不是,您可能希望将它们全部删除,然后让它回退到管理员
答案 2 :(得分:0)
我有类似的问题,就我而言,不是在数据库中创建用户的。您可以以此创建用户
db.createUser({
user: "userNameGoesHereRemovedForSO",
pwd: "passwordGoesHereRemovedForSO",
roles: ["readWrite", "dbAdmin"]
});
答案 3 :(得分:0)
快速解决方法:只需从url
删除数据库名称
var client = new MongoClient("mongodb://root:example@localhost:27017");
var _db = client.GetDatabase("testDB");