Firebird 3 迁移后 Firebird 连接字符串不起作用

问题描述

我在从 v2.5 迁移 firebird 3 后使用 TCP\IP 连接字符串进行了回归。 FirebirdClient 版本是 4.6.1,但我已经使用最新的稳定版本进行了测试,但它也无法正常工作 (v7.10.1)。@H_404_1@

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

堆栈跟踪:@H_404_1@

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 创建的。@H_404_1@

以下是连接字符串的外观(显然不是现实生活中的连接数据):@H_404_1@

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

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

@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 设置如下:@H_404_1@

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

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

解决方法

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

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

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

在相关说明中,您应用的配置不安全。省略 Legacy_Auth 设置的 AuthServer 或 - 如果您仍有无法应用 Srp 的应用程序 - 将其放在最后(对于 {{1} }} 和 AuthServer)。同样,建议将 AuthClient 放在 Legacy_UserManager 的最后(或完全省略),因此默认情况下 - 如果您使用 gsec,或者不包括 {{ 1}} in UserManager - 它将创建更安全的 Srp 类型用户。