解決C#連接Mongo報Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1錯誤


最近做一個基於ABP的.net Core的項目,數據庫選了MongoDB,但是返現無法給數據庫設置認證,只要設置了賬號密碼連接就報錯

連接串如下:

mongodb://root:rootpassword@192.168.100.1/Webdev

已經給了root用戶"__system"角色,使用Robo3T登錄一切正常。但是代碼就是報錯

An unhandled exception occurred while processing the request.
MongoCommandException: Command saslStart failed: Authentication failed..
MongoDB.Driver.Core.WireProtocol.CommandUsingQueryMessageWireProtocol<TCommandResult>.ProcessReply(ConnectionId connectionId, ReplyMessage<RawBsonDocument> reply)

MongoAuthenticationException: Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1.
MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelper(CancellationToken cancellationToken)

mongo是用的docker,剛開始以為是版本問題,找了個低版本的,問題依舊。各種查,baidu、bing、群里問折騰了N久。因為用的是直接基於ABP的.Net Core官方的項目,做開發,直接從ABP官網下載的,代碼沒動過,按道理不應該出現這樣的問題。去掉驗證一切正常,加上就報錯。一度懷疑官網的代碼有Bug,在Github確實看到有一樣提出這個問題的,也沒有答案。

為了排除ABP的項目有Bug,自己新建了一個干凈.Net Core項目,nuget下MongoDB驅動,又一番折騰,報錯是一樣的,排除了是ABP的問題,甚至懷疑是不是MongoDB驅動有問題。

各種折騰后還是沒有結果。最后終於想到了,查看下mongo的log,看看什么錯。

用Robo3T打開Log,查看

 

 這個有點意思了,找不到用戶?看來需要為這個庫添加一個root用戶才行,於是輸入命令:

use Webdev
db.createUser(
    {
        user:"root",
        pwd:"rootpassword",
        roles:[
            {role:"dbOwner", db:"Webdev"}
        ]
    }
)

再次嘗試,終於成功。

深入思考這個問題,root用戶已經配置了"__system"角色,中間也一度配置了“dbAdminAnyDatabase”、“readWriteAnyDatabase”、“hostManager”,“dbOwner”等各種能想到的角色。按道理絕對不存在無權限訪問的問題。Log的信息是說在Webdev這個庫上沒有“root”用戶。添加后也解決了問題。說明驗證的時候使用了Webdev庫,而不是默認的admin庫,由此想到,是否可以通過指定驗證庫來解決這個問題。

通過查詢mongodb官方文檔,找到了authSource參數,然后把連接字符串改成

mongodb://root:rootpassword@192.168.100.1/Webdev?authSource=admin

然后重新開一個docker,配置相應的用戶名密碼和角色,不為Webdev庫設置用戶。直接連接,訪問成功。

結論:

mongodb訪問默認是用當前訪問的庫作為驗證,若要驗證通過可以通過兩種方法。

1、在連接串上指定驗證庫,方法就是在連接串上加上authSource=admin,一般使用admin來做驗證庫

2、為當前的庫添加對應的賬戶、密碼和角色,以滿足默認驗證庫為訪問庫的情況。

 

寫在最后:

1、其實這是碰到了一個弱智問題,主要還是對mongo驗證機制的了解不夠深入造成的。看來還是需要繼續加強學習啊。

2、解決問題的思路有問題,發現問題的第一時間應該首先看Log,Log是第一手的東西,直接告訴了我們發生了什么問題,這次只看了程序Log,沒有看MongoDB Log,所以沒有找到核心問題。

上來就百度,看來也不一定是好辦法。問了一圈也沒有什么結論,最后發現是一個弱智問題,簡直就是秀自己的智商下限。引以為戒!



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM