与Sysdba以外的用户连接的FirebirdSql.Data.FirebirdClient-未定义用户名和密码

问题描述

我使用Firebirdsql.Data.FirebirdClient连接到Firebird数据库(WPF桌面应用程序)。

服务器版本:WI-V3.0.5.33220 Firebird 3.0,而ADO.net提供程序版本为7.5.0(NuGet)

我创建了一个除SYSDBA之外的用户,该用户仅具有对表的只读访问权限(仅SELECT)。与FlameRobin的连接对这个新用户没有问题。但是,当我在FbConnectionStringBuilder类中指定此新用户和相应的只读角色时,会得到一个

“您的用户名密码未定义”

错误。如果我用SYSDBA和相应的密码替换新用户,则连接正常。

using Firebirdsql.Data.FirebirdClient;

namespace Test
{
    class DBConnection
    {
        FbConnection fbConnection;
        public void CreateConnection() 
        {
            FbConnectionStringBuilder builder = new FbConnectionStringBuilder();
            builder.Charset = "WIN1252";
            builder.Database = "firebird2:DB_NAME";
            builder.Dialect = 3;
            builder.Role = "READ_ONLY_OTN";
            builder.UserID = "TEST";
            builder.Password = "Test";
            builder.ServerType = FbServerType.Default;
            fbConnection = new FbConnection(builder.ConnectionString);
            fbConnection.open();
        }
    }
}

除了密码错误(我检查了两次,也使用FlameRobin进行了验证)之外,导致此错误的原因是什么?

解决方法

问题是,当连接到Firebird 3时,Firebird ADO.net提供程序(FirebirdSql.Data.FirebirdClient)仅支持新的SRP身份验证插件,而不支持Legacy_Auth身份验证插件。如果您的用户是使用Legacy_UserManager创建的,则无法使用Firebird ADO.net提供程序进行身份验证。您需要使用Srp创建用户。

根据确切的Firebird配置,您需要将Srp添加到UserManager配置列表中,然后使用以下命令创建用户:

create user <youruser> password '<password>' using plugin srp;

出于安全原因,我建议您删除使用Legacy_UserManager创建的用户:

drop user <youruser> using plugin legacy_usermanager;

我还建议您从Legacy_UserManager列表中删除UserManager,或确保Srp在列表中排在第一位,以避免使用安全性较低的用户管理器意外创建用户(执行不带using plugin <plugin>子句的SQL用户管理语句将默认为列表中的第一个用户管理器。)