2015-12-18 3 views
3

Это мой код для входа в MongoDB с использованием механизмов аутентификации MongoDB.MongoDB C# Проверка драйвера Статус и роль аутентификации

try 
{ 
    var credential = MongoCredential.CreateMongoCRCredential("test", "admin", "123456"); 
    var settings = new MongoClientSettings 
    { 
     Credentials = new[] { credential } 
    }; 
    var mongoClient = new MongoClient(settings); 
    var _database = mongoClient.GetDatabase("test"); 
    var collection = _database.GetCollection<Test>("book"); 
    var filter = new BsonDocument(); 
    var document = collection.Find(new BsonDocument()).ToList(); 
} 
catch (Exception ex) 
{ 
} 

Когда мы ввели неправильное имя пользователя/пароль в учетные данные, как проверить результат входа? В настоящее время я не могу проверить это, мне нужно подождать collection.Find().ToList(), выкинуть TimeoutException, и в этом контексте аутентификация не удалась. Мы должны сделать CRUD, чтобы проверить результат аутентификации (путем ловли TimeoutException). Неправильно проверить статус входа в систему.

И когда мы устанавливаем правильное имя пользователя/пароль для аутентификации, как проверить роль учетной записи в этой базе данных?

ответ

2

Глядя на исходный код клиента C# MongoDB, конструкторы MongoClient не бросают никаких связанных с подключением исключений. Только когда приложение использует MongoClient для выполнения некоторого a на сервере MongoDB, будет выбрано исключение. Однако, как вы обнаружили, это исключение представляет собой общее исключение тайм-аута, указывающее, что драйверу не удалось найти подходящий сервер. Поскольку само исключение содержит сведения о сбое, вы можете использовать эту информацию для создания метода, подобного приведенному ниже, чтобы проверить, можно ли запустить команду dummy в отношении базы данных. В этом методе я свели все время из значений на одну секунду:

public static void CheckAuthentication(MongoCredential credential, MongoServerAddress server) 
    { 
     try 
     { 
      var clientSettings = new MongoClientSettings() 
      { 
       Credentials = new[] {credential}, 
       WaitQueueTimeout = new TimeSpan(0, 0, 0, 1), 
       ConnectTimeout = new TimeSpan(0, 0, 0, 1), 
       Server = server, 
       ClusterConfigurator = builder => 
       { 
        //The "Normal" Timeout settings are for something different. This one here really is relevant when it is about 
        //how long it takes until we stop, when we cannot connect to the MongoDB Instance 
        //https://jira.mongodb.org/browse/CSHARP-1018, https://jira.mongodb.org/browse/CSHARP-1231 
        builder.ConfigureCluster(
         settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(1))); 
       } 
      }; 

      var mongoClient = new MongoClient(clientSettings); 
      var testDB = mongoClient.GetDatabase("test"); 
      var cmd = new BsonDocument("count", "foo"); 

      var result = testDB.RunCommand<BsonDocument>(cmd); 
     } 
     catch (TimeoutException e) 
     { 

      if (e.Message.Contains("auth failed")) 
      { 
       Console.WriteLine("Authentication failed"); 
      } 

      throw; 
     } 
    } 

В соответствии с вашим комментарием вы можете запросить роль для данного пользователя, используя приведенную ниже фрагмент кода:

var mongoClient = new MongoClient(clientSettings); 
var testDB = mongoClient.GetDatabase("test"); 
string userName = "test1"; 
var cmd = new BsonDocument("usersInfo", userName); 
var queryResult = testDB.RunCommand<BsonDocument>(cmd); 
var roles = (BsonArray)queryResult[0][0]["roles"]; 
var result = from roleDetail in roles select new {Role=roleDetail["role"].AsBsonValue.ToString(),RoleDB=roleDetail["db"].AsBsonValue.ToString()}; 
+0

Большое спасибо мой братан :) Первые проблемы решены. И секунды, как получить Роли пользователя (пользователя механизмов проверки подлинности MongoDB), которые мы наложили на строку подключения или на учетную запись – user2877989

+0

. Я распространил свой ответ на вторую часть. – Jaco

+0

Perfect my bro :) – user2877989

Смежные вопросы