web-dev-qa-db-ja.com

C#クライアント経由でMongoDB(MongoLabs)に接続できません

質問の背景:

MongoLabs(mLab- https://mlab.com/ )でデータベースをセットアップし、非常に単純なコレクションを追加しました。 MongoDBドライバーを使用して、C#3.2ドライバー経由でこのコレクションに接続し、作業を試みています。

問題:

次のように、C#ドライバーを介してデータベースに接続できません。

System.TimeoutException:30000ms後にCompositeServerSelector {Selectors = ReadPreferenceServerSelector {ReadPreference = {Mode = Primary、TagSets = []}}、LatencyLimitingServerSelector {AllowedLatencyRange = 00:00:00.0150000}}を使用してサーバーを選択した後にタイムアウトが発生しました。クラスター状態のクライアントビューは{ClusterId: "1"、ConnectionMode: "Automatic"、Type: "Unknown"、State: "Disconnected"、Servers:[{ServerId: "{ClusterId:1、EndPoint:" Unspecified/ds048719。 mlab.com:48719 "}"、EndPoint: "Unspecified/ds048719.mlab.com:48719"、状態: "Disconnected"、タイプ: "Unknown"、HeartbeatException: "MongoDB.Driver.MongoConnectionException:を開いているときに例外が発生しましたサーバーへの接続---> MongoDB.Driver.MongoAuthenticationException:saslプロトコルメカニズムSCRAM-SHA-1を使用して認証できません---> MongoDB.Driver.MongoCommandException:コマンドsaslStartが失敗しました:認証に失敗しました。

コード:

リクエストを認証しようとするさまざまな方法を試しました。現在、私は単にMongoClientクラスを使用しようとしています。

MongoClient client;

var connectionString = "mongodb://userNameGoesHereRemovedForSO:[email protected]:48719/db";

client = new MongoClient(connectionString);

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

var collection = database.GetCollection<string>("test");

この認証の問題を解決するためのヘルプや例をいただければ幸いです。

9
user1352057

私が推測を危険にさらす必要があった場合、問題はおそらくファイアウォールの問題です。以下を確認してください

  • C#アプリケーションホストからのホスト(ds048719.mlab.com)のnslookup
  • C#アプリケーションホストからのホスト(ds048719.mlab.com)のping(mLabの設定によっては失敗する場合があります)
  • あなたのIPアドレスが whitelisted であること
  • C#アプリケーションが実行されているのと同じホストからMongo Shellを使用して接続をテストします。 mLabにはドキュメントがあります ここ
  • 生のtelnetを使用して接続をテストします。例:telnet ds048719.mlab.com 48719
  • 正しいauthenticationDatabaseを使用していることを確認してください(この例では、これは/db)、これは通常adminですが、共有インスタンスを使用している場合はデータベース名になる可能性があります。

C#ドライバーとの接続に関するドキュメントは、 MongoDB C#Driver Docs にあります。次の点に注意することが重要です。

データベースコンポーネント

データベースコンポーネントはオプションであり、認証対象のデータベースを示すために使用されます。データベースコンポーネントが提供されない場合、「admin」データベースが使用されます。

mongodb://Host:27017/mydb

上記の「mydb」という名前のデータベースは、アプリケーションの資格情報が格納される場所です。

注:

一部のドライバーは、データベースコンポーネントを使用して、デフォルトで動作するデータベースを示します。 .NETドライバーは、データベースコンポーネントを解析する間、認証以外の目的でデータベースコンポーネントを使用しません。

最後に、将来的には、SOに投稿するときにホスト名とポートを難読化することをお勧めします。あいまいさだけによるセキュリティは悪いポリシーですが、MongoDBデプロイメントの防御層を確実に追加します。

14
Pete Garafano

接続文字列が正しくない可能性があります。最後に/ dbがありますが、「db」は認証データベースの名前ですか?

認証データベースが正しいことを確認してください。そうでない場合は、すべて一緒に削除して、管理者にフォールバックさせることができます。

1
pieperu

同様の問題があります。私の場合、ユーザーがデータベースに作成されていません。これでユーザーを作成できます

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