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

Unable to authenticate when using MongoClientSettings

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

通过连接字符串进行身份验证 正在 工作:

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

    _client = new MongoClient(connectionString);

    // ...
}

MongoClientSettings 的身份验证 有效:

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: A timeout occured after 3000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "Standalone", Type : "Standalone", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/myDomain.com:27017" }", EndPoint: "Unspecified/myDomain.com:27017", State: "Disconnected", Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> MongoDB.Driver.MongoAuthenticationException: Unable to authenticate username 'myUsername' on database 'myDatabaseName'. ---> MongoDB.Driver.MongoCommandException: Command authenticate failed: auth failed.

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

我是否遗漏了什么或者这是 MongoDb C# 驱动程序中的错误?

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

感谢您的帮助!

这是一个与调用 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"
);