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

Ing*_*mar 5 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);

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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);

   // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

我是否遗漏了任何内容,或者这是 C# 的 MongoDb 驱动程序中的错误?

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

谢谢你的帮助!

Nko*_*osi 5

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

跟踪提供的异常到MongoDBCRAuthenticator

虽然从 MongoDB 3.6 开始已弃用,但原始问题表明使用MongoDb.Driver 2.6.1

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

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

var credentials = MongoCredential.CreateCredential(
    databaseName: "myDatabaseName", 
    username: "myUsername", 
    password: "myPassword"
);
Run Code Online (Sandbox Code Playgroud)