我正在尝试从我的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"
}
]
}
答案 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我会看到以下内容:
需要注意的部分是使用的凭据是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。
重新运行控制台应用程序,如我的问题所示,findOne命令现在可以按预期工作。