连接到 MySQL 8 时 C# 应用程序出现身份验证异常

2023-12-30

我们编写了一个测试工具,因为我们的应用程序在连接到 MySQL 8 数据库时出现以下异常:

Unhandled Exception: System.Security.Authentication.AuthenticationException: 
    Authentication to host 'xxx.xxx.x.xx' faied.
        at MySql.Data.Common.Ssl.StartSSL(Stream& baseStream, 
            Encoding encoding, String connectionString)
        at MySql.Data.MySqlClient.NativeDriver.Open()
        at MySql.Data.MySqlClient.Driver.Open()
        at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
        at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
        at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
        at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
        at MySql.Data.MySqlClient.MySqlPool.GetConnection()
        at MySql.Data.MySqlClient.MySqlConnection.Open()
        at DatabaseTestConnection.Program.Main(String[] args)

所以我编写了以下测试工具来尝试获取更多调试信息......

using MySql.Data.MySqlClient;
using System;

namespace DatabaseTestConnection
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("MySQL Database Connection Test");
            Console.WriteLine("Please enter database IP");
            string dbIP = Console.ReadLine();

            string connectionString = @$"
                SERVER={dbIP};
                DATABASE=test;
                UID=xxxxx;
                PASSWORD=xxxxxx;
                DEFAULT COMMAND TIMEOUT = 180;";

            MySqlConnection connection = new MySqlConnection(connectionString);

            try
            {
                Console.WriteLine("Connecting to the database....");
                connection.Open();
                Console.WriteLine("Succesfully Connected to the database....");
            }
            catch (MySqlException ex)
            {
                switch (ex.Number)
                {
                    case 0:
                        Console.WriteLine(
                            "{0} {1} : Cannot connect to server. Contact adminis",
                            DateTime.Now.ToLongDateString(),
                            DateTime.Now.ToLongTimeString());
                        break;
                    case 1045:
                        Console.WriteLine(
                            "{0} {1} : Invalid username/password, please try again",
                            DateTime.Now.ToLongDateString(),
                            DateTime.Now.ToLongTimeString());
                        break;
                    default:
                        Console.WriteLine(
                            "{0} {1} : Unable to open connection: {2}",
                            DateTime.Now.ToLongDateString(),
                            DateTime.Now.ToLongTimeString(),
                            ex.Message);
                        break;
                }
                Console.WriteLine("Press any key to continue....");
                Console.ReadLine();
                System.Environment.Exit(1);
            }

            Console.WriteLine("Counting users table....");
            int Count = 0;
            
            //Create Mysql Command
            using (MySqlCommand cmd = new MySqlCommand())
            {
                cmd.Connection = connection;
                cmd.CommandText = "SELECT COUNT(*) FROM users";                    

                try
                {
                    //ExecuteScalar will return one value
                    Count = int.Parse(cmd.ExecuteScalar() + "");
                    Console.WriteLine(
                        $"Counted {Count.ToString()} users in the users table");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("{0} {1} : Database error on Select count: {2}",
                        DateTime.Now.ToLongDateString(),
                        DateTime.Now.ToLongTimeString(),
                        ex.Message);

                    Count = 0;
                    Console.WriteLine("Press any key to continue....");
                    Console.ReadLine();
                    System.Environment.Exit(1);
                }
            }

            try
            {
                Console.WriteLine("Closing the connection....");
                connection.Close();
                Console.WriteLine("Succesfully closed the connection");
                Console.WriteLine("Press any key to continue....");
                Console.ReadLine();
            }
            catch (MySqlException ex)
            {
                Console.WriteLine("{0} {1} : Unable to close connection: {2}",
                    DateTime.Now.ToLongDateString(),
                    DateTime.Now.ToLongTimeString(),
                    ex.Message);

                Console.WriteLine("Press any key to continue....");
                Console.ReadLine();
            }
        }
    }
}

测试工具在一台不在 AD 中的电脑上运行,但在 AD 中的电脑上失败并出现上述错误。

我是否在连接字符串中缺少一些附加配置?


我在 ModDbExport 模块中遇到了同样的问题快速SCADA。导出到 MSSQL 时我没有遇到任何问题,但导出到 MySQL 却并不简单。

  1. 连接选项仅限于服务器、数据库和登录凭据。连接字符串是唯一的方法。

  2. 有一个模糊的选项,SslMode,这显然默认为“首选”,并且连接不起作用。注意:连接“不”安全,因为安全性是由转发本地主机端口 3306 的 SSH 隧道提供的...导出模块认为它正在连接并向本地计算机发送数据,但相反,它通过以下方式将其发送到数据库服务器:安全通道)。

解决方案是明确声明SslMode=None在连接字符串中。数据导出工作完美无缺。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连接到 MySQL 8 时 C# 应用程序出现身份验证异常 的相关文章

  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 使用不带参数的 Split() 时,默认分隔符是什么?

    所以我看了看String Split 今天 C 中的方法 我意识到你也可以向它传递零参数 这是我从未考虑过的 使用时默认的分隔符是什么Split 没有任何参数 如果没有值 则为空白 来源自here https msdn microsoft
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • 如何在 SEQUELIZE (nodeJS) 中创建触发器?

    我正在尝试使用sequelize 创建一个触发器 主要思想是创建一个实例CONFIG创建后USER USER MODEL module exports function sequelize DataTypes var User sequel
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in

随机推荐