最近做一個基於ABP的.net Core的項目,資料庫選了MongoDB,但是返現無法給資料庫設置認證,只要設置了賬號密碼連接就報錯 連接串如下: mongodb://root:[email protected]/Webdev 已經給了root用戶"__system"角色,使用Ro ...
最近做一個基於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:"rootpassword", 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,所以沒有找到核心問題。
上來就百度,看來也不一定是好辦法。問了一圈也沒有什麼結論,最後發現是一個弱智問題,簡直就是秀自己的智商下限。引以為戒!