C#调用MySqlConnection.Open()报mysql_native_password认证访问被拒绝如何解决
异常排查解决步骤
该报错本质是MySQL服务端拒绝了程序的登录请求,问题完全出在数据库连接建立环节,和后续插入逻辑无关,按以下步骤逐一排查即可:
1 基础连接配置校验
- 确认连接字符串的四个参数完全正确,你当前代码里的参数都是占位符,实际运行需替换为真实值:
SERVER:填MySQL服务器的真实IP/域名,本地测试可写127.0.0.1或localhostUID:填MySQL中真实存在的用户名,注意MySQL用户名大小写敏感,统一用小写可避免意外问题PASSWORD:确认密码无多余空格、特殊字符转义错误,如果密码包含;、'这类特殊字符,需要用引号包裹密码,写法为PASSWORD="your;pass?word";DATABASE:确认目标库在MySQL中真实存在,且所用账号有权限访问该库
- 先拿数据库管理工具(Navicat、DBeaver、MySQL命令行)用完全相同的IP、账号、密码、库名尝试连接,能连通再测试代码,可排除大部分配置错误。
2 MySQL用户权限校验
报错明确提示拒绝的是user'@'p4fe986ad.dip0.t-ipconnect.de来源的登录请求,MySQL用户权限是和登录来源IP/域名绑定的,需要做如下校验:
- 登录MySQL服务端,执行SQL查询对应用户的权限配置:
SELECT user, host FROM mysql.user WHERE user = '替换为你的真实用户名'; - 如果需要允许该用户从任意IP登录,执行以下SQL修改权限并刷新生效:
-- 修改用户允许登录的来源 UPDATE mysql.user SET host = '%' WHERE user = '替换为你的真实用户名' AND host = '原配置的host值'; -- 给用户分配对应库的操作权限 GRANT ALL PRIVILEGES ON 替换为你的库名.* TO '替换为你的真实用户名'@'%'; -- 刷新权限立即生效 FLUSH PRIVILEGES; - 如果需要限制仅固定IP登录,把
%替换为程序运行的出口IP或者报错里的域名p4fe986ad.dip0.t-ipconnect.de即可。
3 特殊场景排查
- 确认用户的身份验证插件和报错中匹配,执行以下SQL查询:
如果插件不是SELECT user, host, plugin FROM mysql.user WHERE user = '替换为你的真实用户名';mysql_native_password,执行SQL修改:ALTER USER '替换为你的真实用户名'@'%' IDENTIFIED WITH mysql_native_password BY '替换为你的真实密码'; FLUSH PRIVILEGES; - 检查MySQL服务端防火墙是否开放3306默认端口,是否配置了IP白名单限制,可通过
telnet 你的MySQL服务器IP 3306命令测试网络连通性。
额外代码优化提示
你当前的SQL拼接写法存在严重的SQL注入漏洞,建议改为参数化查询,同时用using块管理数据库连接避免资源泄漏,示例如下:
string verbindungsdaten1 = "SERVER=server;" + "DATABASE=db;" + "UID=user;" + "PASSWORD=password;"; // using块会自动释放连接资源,无需手动调用Close using(MySqlConnection verbindung1 = new MySqlConnection(verbindungsdaten1)) { string command = "INSERT INTO Accounts VALUES (@username, @password, false);"; MySqlCommand com = new MySqlCommand(command, verbindung1); // 参数化赋值,完全避免SQL注入风险 com.Parameters.AddWithValue("@username", text); com.Parameters.AddWithValue("@password", utils.hashPassword(confirmed_pass)); verbindung1.Open(); com.ExecuteNonQuery(); }
内容的提问来源于stack exchange,提问作者Sarper Eroglu
相关产品推荐
相关产品推荐

