C#連線Mongo報Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1錯的解決方案
---恢復內容開始---
最近做一個基於ABP的.net Core的專案,資料庫選了MongoDB,但是返現無法給資料庫設定認證,只要設定了賬號密碼連線就報錯
連線串如下:
mongodb://root:[email protected]/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:"password", roles:[ {role:"dbOwner", db:"Webdev"} ] } )
再次嘗試,終於成功。
深入思考這個問題,root使用者已經配置了"__system"角色,中間也一度配置了“dbAdminAnyDatabase”、“readWriteAnyDatabase”、“hostManager”,“dbOwner”等各種能想到的角色。按道理絕對不存在無許可權訪問的問題。Log的資訊是說在Webdev這個庫上沒有“root”使用者。新增後也解決了問題。說明驗證的時候使用了Webdev庫,而不是預設的admin庫,由此想到,是否可以通過指定驗證庫來解決這個問題。
通過查詢mongodb官方文件,找到了authSource引數,然後把連線字串改成
mongodb://root:[email protected]/Webdev?authSource=admin
然後重新開一個docker,配置相應的使用者名稱密碼和角色,不為Webdev庫設定使用者。直接連線,訪問成功。
結論:
mongodb訪問預設是用當前訪問的庫作為驗證,若要驗證通過可以通過兩種方法。
1、在連線串上指定驗證庫,方法就是在連線串上加上authSource=admin,一般使用admin來做驗證庫
2、為當前的庫新增對應的賬戶、密碼和角色,以滿足預設驗證庫為訪問庫的情況。
寫在最後:
1、其實這是碰到了一個弱智問題,主要還是對mongo驗證機制的瞭解不夠深入造成的。看來還是需要繼續加強學習啊。
2、解決問題的思路有問題,發現問題的第一時間應該首先看Log,Log是第一手的東西,直接告訴了我們發生了什麼問題,這次只看了程式Log,沒有看MongoDB Log,所以沒有找到核心問題。
上來就百度,看來也不一定是好辦法。問了一圈也沒有什麼結論,最後發現是一個弱智問題,簡直就是秀自己的智商下限。引以為