无法通过C#客户端连接到MongoDB(MongoDB)

无法通过C#客户端连接到MongoDB(MongoDB),c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,问题背景: 我在Mongonabs(mLab-)中设置了一个数据库,并添加了一个非常简单的集合。我正在使用MongoDB驱动程序尝试通过C#3.2驱动程序连接并使用此集合 问题: 我无法通过C#驱动程序连接到我的数据库,需要持续的身份验证,如图所示: MongoClient client; var connectionString = "mongodb://userNameGoesHereRemovedForSO:passwordGoesHereRemovedForSO@ds048555.ml

问题背景:

我在Mongonabs(mLab-)中设置了一个数据库,并添加了一个非常简单的集合。我正在使用MongoDB驱动程序尝试通过C#3.2驱动程序连接并使用此集合

问题:

我无法通过C#驱动程序连接到我的数据库,需要持续的身份验证,如图所示:

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");
System.TimeoutException:使用CompositeServerSelector{Selectors=ReadPreferenceServerSelector{ReadPreference={Mode=Primary,TagSets=[]},LatencyMitingServerSelector{AllowedLatencyRange=00:00.0150000}选择服务器30000ms后发生超时。群集状态的客户端视图为{ClusterId:“1”,连接模式:“自动”,类型:“未知”,状态:“断开”,服务器:[{ServerId:{ClusterId:1,端点:“Unspecified/ds048719.mlab.com:48719”},端点:“Unspecified/ds048719.mlab.com:48719”,状态:“断开”,类型:“未知”,异常:“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");
MongoClient客户端;
变量连接字符串=”mongodb://userNameGoesHereRemovedForSO:passwordGoesHereRemovedForSO@ds048555.mlab.com:48719/db”;
客户端=新的MongoClient(connectionString);
var database=client.GetDatabase(“testDB”);
var collection=database.GetCollection(“测试”);

非常感谢您提供帮助或示例,说明如何成功克服此身份验证问题。

如果我不得不冒险猜测,此问题很可能是防火墙问题。您应该检查以下内容

  • 来自C#应用程序主机的主机(ds048719.mlab.com)的
    nslookup
  • 从C#应用程序主机对主机(ds048719.mlab.com)执行ping操作(可能会失败,具体取决于mlab的设置)
  • 你的IP地址是
  • 使用运行C#应用程序的同一主机上的Mongo Shell测试连接。mLab有文档
  • 使用原始的
    telnet
    测试连接,例如
    telnet ds048719.mlab.com 48719
  • 确保您使用的是正确的
    authenticationDatabase
    (在您的示例中,这是由
    /db
    指定的),这通常是
    admin
    ,但如果您在共享实例上,则可能是您的数据库名称
您可以在中找到有关连接C#驱动程序的文档。请务必注意以下几点:

数据库组件

数据库组件是可选的,用于指示要针对哪个数据库进行身份验证。如果未提供数据库组件,则使用“admin”数据库

mongodb://host:27017/mydb

上面,名为“mydb”的数据库是存储应用程序凭据的地方

注意:

某些驱动程序使用数据库组件来指示默认情况下使用哪个数据库。NET驱动程序在解析数据库组件时,除了身份验证之外,不会将数据库组件用于任何其他用途


最后,我建议在将来发布到SO时混淆主机名和端口。虽然仅通过模糊性进行安全保护是一项不好的策略,但它肯定会为MongoDB部署添加一层防御措施。

您的连接字符串可能不正确。您的结尾是/db,“db”是身份验证数据库的名称吗


确保您的身份验证数据库正确无误。如果不正确,您可能希望将其全部删除,并让其返回给管理员

我也有类似问题,在我的情况下,用户不是在数据库中创建的。您可以通过此方法创建用户

db.createUser({
      user: "userNameGoesHereRemovedForSO",
      pwd: "passwordGoesHereRemovedForSO",
      roles: ["readWrite", "dbAdmin"]
    });

快速解决方法:只需从
url

var client = new MongoClient("mongodb://root:example@localhost:27017");

var _db = client.GetDatabase("testDB");

C#driver通过
client.GetDatabase
方法获取数据库引用。连接字符串中指定的数据库是
authenticationDatabase
谢谢@PeteGarafano。这一点信息让我无法验证您的问题导致我质疑哪个“db”我试图连接到。出于某种奇怪的原因,我似乎只能连接到admin,它让我可以处理我所有的数据库,我不确定这是我想要的,但它现在可以工作。谢谢@Piepuru!非常有用!我没有在最后添加用于身份验证的DB。因为我的身份验证失败了。