命令查找失败:未在<dbname>上授权执行命令{find:<collectionname>

时间:2017-09-30 21:20:01

标签: c# mongodb

我正在尝试从我的C#MVC ASP.net应用程序执行FindOne。

不幸的是,这失败并出现以下错误:

  

“MongoDB.Driver.MongoCommandException”类型的未处理异常   发生在MongoDB.Driver.Core.dll

     

其他信息:命令查找失败:未经授权   twitterstream执行命令{find:“tweets”,filter:{},limit:   1,singleBatch:true}。

如果我启动MongoDB shell并运行以下命令:

> use twitterstream
switched to db twitterstream
> db.auth("demouser", "abcd")
1
> db.tweets.findOne()

findOne()命令执行并显示记录。

我在C#应用程序中错过了什么或错过了哪些步骤?

为了使测试用例尽可能小,我使用下面列出的控制台应用程序重现了这个问题:

我正在使用MongoDB 3.4.6。

控制台应用程序依赖于两个NuGet包; MongoDB.Driver(2.4.4)和mongocsharpdriver(2.4.4)

的App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
    </startup>
    <appSettings>    
      <add key="MongoDatabaseName" value="twitterstream" />
      <add key="MongoUsername" value="demouser" />
      <add key="MongoPassword" value="abcd" />
      <add key="MongoPort" value="27017" />
      <add key="MongoHost" value="localhost" />
    </appSettings>
</configuration>

MongoContext.cs

using System;
using System.Configuration;
using MongoDB.Driver;

namespace DisplayingMongoConsoleApp
{
    public class MongoContext
    {
        MongoClient _client;
        MongoServer _server;

        public MongoDatabase _database;

        public MongoContext()
        {
            // reading creditials from web.config file
            var MongoDatabaseName = ConfigurationManager.AppSettings["MongoDatabaseName"];
            var MongoUsername = ConfigurationManager.AppSettings["MongoUsername"];
            var MongoPassword = ConfigurationManager.AppSettings["MongoPassword"];
            var MongoPort = ConfigurationManager.AppSettings["MongoPort"];
            var MongoHost = ConfigurationManager.AppSettings["MongoHost"];

            // creating creditials
            var credential = MongoCredential.CreateMongoCRCredential(MongoDatabaseName, MongoUsername, MongoPassword);

            // creating MongoClientSettings
            var settings = new MongoClientSettings
            {
                Credentials = new[] { credential },
                Server = new MongoServerAddress(MongoHost, Convert.ToInt32(MongoPort))
            };

            _client = new MongoClient(settings);
            _server = _client.GetServer();
            _database = _server.GetDatabase(MongoDatabaseName);

        }

    }
}

TweetModel

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;

namespace DisplayingMongoConsoleApp
{
    public class TweetModel
    {
        [BsonId]
        public ObjectId Id { get; set; }

        [BsonElement("thetweet")]
        public string Tweet { get; set; }
    }
}

Program.cs的

namespace DisplayingMongoConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            MongoContext mongo = new MongoContext();

            var tweetDetails = mongo._database.GetCollection<TweetModel>("tweets").FindOne();


        }
    }
}

更新1:以下是demouser的角色:

> db.getUser("demouser")
{
        "_id" : "twitterstream.demouser",
        "user" : "demouser",
        "db" : "twitterstream",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "twitterstream"
                },
                {
                        "role" : "read",
                        "db" : "twitterstream"
                }
        ]
}

2 个答案:

答案 0 :(得分:1)

Mongo司机:

<package id="MongoDB.Driver" version="2.4.4" targetFramework="net46" />

            var _conn = string.Format(@"mongodb://{0}:{1}@{2}:{3}/{4}"
                                , MongoUsername
                                , MongoPassword
                                , MongoHost
                                , MongoPort
                                , MongoDatabaseName);

            var _client = new MongoClient(_conn);
            var _database = _client.GetDatabase(MongoDatabaseName);


            var twees = _database.GetCollection<Group>("tweets");
            var r = twees.AsQueryable().Select(x => x).ToList();

            Console.WriteLine(r.Count());

答案 1 :(得分:1)

由于这个链接,最终解决了这个问题。

https://www.claudiokuenzler.com/blog/553/authentication-mongodb-3.x-failed-with-mechanism-mongodb-cr

从这一页开始,最重要的段落是:

  

MongoDB的默认身份验证方法是挑战和响应   机制(SCRAM-SHA-1)。以前,MongoDB使用MongoDB Challenge   和响应(MONGODB-CR)作为默认值。

在进行任何更改之前检查demouser我会看到以下内容:

enter image description here

需要注意的部分是使用的凭据是SCRAM-SHA-1。

按照链接中的说明,我禁用了身份验证,然后在Mongo shell中使用以下内容,我将我的Mongo实例更改为使用旧的身份验证方法:

> use admin 
switched to db admin 
>  var schema = db.system.version.findOne({"_id" : "authSchema"}) 
> schema.currentVersion = 3 
3 
> db.system.version.save(schema) 
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 

然后我启用了身份验证,删除并重新创建了demouser:请注意,凭据现在使用预期的MONGODB-CR。

enter image description here

重新运行控制台应用程序,如我的问题所示,findOne命令现在可以按预期工作。