2015-08-06 15 views
5

Wykonuję projekt MongoDB oparty na sterowniku .NET 2.0, który wymaga uwierzytelnienia na MongoDB. Istnieje przykładowy kod dla tego, co robię:Złap MongoAuthenticationException w Mongo Sterownik .NET 2.0

public static bool createConneciton(string login, SecureString pass, string authDB) { 
    var settings = new MongoClientSettings { 
     Credentials = new[] { 
      MongoCredential.CreateCredential(authDB, login, pass) 
     }, 
     Server = new MongoServerAddress("my.mongodb.server", 27017) 
    }; 
    mongoClient = new MongoClient(settings); 
    return true; 
} 

if (Mongo.createConneciton(textBoxUsername.Text, pass, textBoxAuthDatabase.Text)) 
    Task<BsonDocument> results = Mongo.getNodeStats(); 

public static async Task<BsonDocument> getNodeStats() { 
    try { 
     var db = Mongo.mongoClient.GetDatabase("admin"); 
     var command = new BsonDocument { 
      {"serverStatus",1} 
     }; 
     BsonDocument result = await db.RunCommandAsync<BsonDocument>(command).ConfigureAwait(false); 
       return result; 
    } 
    catch (Exception ex) 
    { 
     Logging.Log(ex); 
     return null; 
    } 
} 

Głównym problemem jaki do tej pory napotkałem jest przetwarzanie poświadczeń użytkownika. Ponieważ wszystkie operacje są leniwy, a połączenie otwiera się tylko po wykonaniu w metodzie getNodeStats(). Jeśli więc użytkownik wpisze nieprawidłowe poświadczenia, będzie czekał przez 30 sekund, ponieważ zamiast MongoDB.AuthenticationException lub nawet metoda MongoDB.ConnectionException przechodzi do wyjątku System.Timeout. Jeśli spojrzysz chociaż na tekst wyjątku, który jest dość oczywisty, że oba są podniesione, ale nie przechwycone.

"MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> MongoDB.Driver.MongoAuthenticationException: Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1 

Moją pierwszą myślą było zmusić otwarte połączenie w celu sprawdzenia referencji tak szybko, jak użytkownik wpisze je i wciśnij przycisk łączenia, a następnie czeka na jakiekolwiek polecenia do wykonania, ale widocznie klasa MongoClient nie ma .Open() metoda już. Więc jeśli nie wydaje się to możliwe, przynajmniej chciałbym przechwycić wyjątek AuthenticationException bez czekania na timeout, ale z pomysłów, gdzie powinienem spróbować go złapać.

+3

Z ciekawości, znalazłeś odpowiedź na ten problem? – Mantisen

Odpowiedz

1

Nie można podłączyć MongoDB użyciu MongoCredential.CreateCredential .you musiał użyć MongoCredential.CreateMongoCRCredential metodę łączenia db. Ponieważ poprzednie referencje używają mechanizmu SCRAM-SHA-1 do łączenia db, w .NET, który się nie powiedzie. I powód, dla którego nie wyjaśniam.

Korzystanie MongoCredential.CreateMongoCRCredential, masz zmiany "authSchema" ustawienie w MongoDB. Możesz odnieść się do: MongoDB-CR Authentication failed