Firebird 连接字符串不工作 post Firebird 3 迁移

Firebird connection string not working post Firebird 3 migration

我有一个回归 TCP\IP 连接字符串 post 从 v2.5 迁移到 firebird 3。 FirebirdClient 版本是 4.6.1,但我已经使用最新的稳定版本进行了测试,它也不起作用 (v7.10.1)。

错误消息是“您的用户名和密码未定义。请您的数据库管理员设置 Firebird 登录”。

堆栈跟踪:

at FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect()
   at FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Pool.GetConnection(FbConnection owner)
   at FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Get(ConnectionString connectionString, FbConnection owner)
   at FirebirdSql.Data.FirebirdClient.FbConnection.Open()

用户是通过 IBExpert 创建的 UI。

这是连接字符串的样子(显然不是现实生活中的连接数据):

@"Database=inet://10.000.0.000:3050/C:\Database.FDB;User=MY_USER;Password=secret";

如果使用如下标准的相同网络连接字符串,则同一用户工作:

@dialect=3;initial catalog=C:\Database.FDB;data source=localhost;user id=MY_USER;password=secret;character set=ISO8859_1;pooling=True;connection lifetime=30;server type=Default;port number=3050

我的firebird.conf是这样设置的:

ServerMode = Super
DefaultDbCachePages = 100K
FileSystemCacheThreshold = 100M
TempBlockSize = 2M
TempCacheLimit = 4000M
AuthServer = Legacy_Auth, Srp, Win_Sspi
AuthClient = Legacy_Auth, Srp, Win_Sspi
UserManager = Legacy_UserManager, Srp
WireCrypt = Enabled 
RemoteServicePort = 3050
LockMemSize = 30M
LockHashSlots = 30011
RemoteAccess = true

不确定我在这里遗漏了什么。上面的连接字符串适用于 SYSDBA。根据我读过的火鸟文档,它看起来不错。我已经阅读了所有其他具有相同问题的 Whosebug 票证,但没有看到任何对我有用的答案。有什么想法吗?

最近的FirebirdSql.Data.FirebirdClient版本支持Firebird 3的13-15版wire协议,之后只支持Srp认证。您的旧版本仅支持 v12 协议 (Firebird 2.5),然后将使用旧版身份验证。如果您使用 Legacy_UserManager(配置中的默认设置)创建用户,则您无法使用版本 7.10.1(您可以使用 4.6.1)进行身份验证,因为就 Srp 身份验证插件而言,该用户不存在。

您似乎使用 gsec 创建了用户,它始终应用默认用户管理器(仅供参考,gsec 已被弃用,因为Firebird 3),或者您使用了 CREATE USER 而没有 USING PLUGIN Srp(或 USING PLUGIN Legacy_UserManager)。您可以通过检查 select sec$user_name, sec$plugin from sec$users 的输出来验证这一点。解决方案是删除用户,然后使用正确的用户管理器 (USING PLUGIN Srp) 重新创建它。

请注意,理论上您可以同时拥有 Srp 和 Legacy_UserManager 的用户(例如,如果无法使用 Srp 进行身份验证的应用程序需要使用同一用户),但它更安全让用户只存在一个插件。

在相关说明中,您应用的配置不安全。省略 AuthServer 设置的 Legacy_Auth 或 - 如果您仍然有无法应用 Srp 的应用程序 - 将其设置为 last (对于两者AuthServerAuthClient)。同样,建议将 Legacy_UserManager 放在 UserManager 的最后(或完全省略),因此默认情况下 - 如果您使用 gsec,或者不使用在 CREATE USER 中包含 USING PLUGIN xxx - 它将创建更安全的 Srp 类型用户。