问题描述
我使用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用户管理语句将默认为列表中的第一个用户管理器。)