使用MongoClientSettings时无法进行身份验证

时间:2018-05-28 12:43:11

标签: c# mongodb-.net-driver

我正在尝试连接到MongoDb数据库。

  • 我的客户端:使用MongoDb.Driver 2.6.1的ASP.NET Core 2
  • 我的服务器:MongoDb 3.6.5社区版,独立(无副本集),Windows Server 2016上的64位。

按连接字符串进行身份验证正在运行:

public MongoDbContext(AppSettings appSettings)
{
    var connectionString = "mongodb://myUsername:myPassword@myDomain.com:27017/myDatabaseName";

    _client = new MongoClient(connectionString);

    // ...
}

MongoClientSettings的身份验证 NOT 正在运行:

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,
        ServerSelectionTimeout = TimeSpan.FromSeconds(3)
    };

    _client = new MongoClient(mongoClientSettings);

   // ...
}
  

TimeoutException:使用CompositeServerSelector选择服务器3000ms后发生超时{Selectors = MongoDB.Driver.MongoClient + AreSessionsSupportedServerSelector,LatencyLimitingServerSelector {AllowedLatencyRange = 00:00:00.0150000}}。群集状态的客户端视图是{ClusterId:" 1",ConnectionMode:" Standalone",Type:" Standalone",State:" Disconnected" ,服务器:[{ServerId:" {ClusterId:1,EndPoint:" Unspecified / myDomain.com:27017" }",EndPoint:"未指定/ myDomain.com:27017",状态:"已断开连接",键入:"未知",HeartbeatException:&#34 ; MongoDB.Driver.MongoConnectionException:打开与服务器的连接时发生异常。 ---> MongoDB.Driver.MongoAuthenticationException:无法验证用户名' myUsername'在数据库' myDatabaseName'。 ---> MongoDB.Driver.MongoCommandException:命令验证失败:验证失败。

我一直在使用两种方法完全相同的值(大写和小写)。但只有MongoClientSetting方法才会抛出异常。但是出于不同的原因,我宁愿使用MongoClientSetting方法而不是基于连接字符串的方法。

我错过了什么,或者这是用于C#的MongoDb驱动程序中的错误?

为避免误解:在上面的示例中,我交换了所有真实值(用户名,密码等)作为假值。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这是与对MongoCredential.CreateMongoCRCredential的调用有关的身份验证问题,它使用MONGODB-CR(挑战-响应)身份验证机制来创建凭据。

将提供的异常跟踪到MongoDBCRAuthenticator

deprecated as of MongoDB 3.6时,原始问题使用 MongoDb.Driver 2.6.1

表示

但是,工作连接字符串没有任何authMechanism身份验证选项,这意味着它将使用默认的身份验证机制。

使用MongoCredential.CreateCredential创建与使用连接字符串相似的默认凭据

var credentials = MongoCredential.CreateCredential(
    databaseName: "myDatabaseName", 
    username: "myUsername", 
    password: "myPassword"
);