欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解决C#连接Mongo报Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1错误

程序员文章站 2022-06-29 21:23:14
最近做一个基于ABP的.net Core的项目,数据库选了MongoDB,但是返现无法给数据库设置认证,只要设置了账号密码连接就报错 连接串如下: mongodb://root:rootpassword@192.168.100.1/Webdev 已经给了root用户"__system"角色,使用Ro ......

最近做一个基于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,查看

解决C#连接Mongo报Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1错误

 

 这个有点意思了,找不到用户?看来需要为这个库添加一个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,所以没有找到核心问题。

上来就百度,看来也不一定是好办法。问了一圈也没有什么结论,最后发现是一个弱智问题,简直就是秀自己的智商下限。引以为戒!


解决C#连接Mongo报Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1错误