我尝试从ASP.NET(Razor)网页连接到MySql(版本5.0.95)数据库...
(汇编MySql.Data.dll,v6.6.5.0)
首先,我尝试直接在连接字符串中指定密码,如"...;pwd=myClearPassword"
。但是当试图打开时获得了错误
“不再支持使用旧密码进行身份验证,请使用4.1样式 密码“。
所以我现在尝试更新我的代码,如下所示:
@using MySql.Data.MySqlClient
@using System.Security.Cryptography
private const string ConnectionStringFormat =
"server=xxx.xx.xxx.xx;database=mydbname;uid=username;pwd={0};";
private string GetHashedPassword(string clearPassword)
{
var hasher = new SHA256Managed();
var unhashedPassword = System.Text.Encoding.Unicode.GetBytes(clearPassword);
var hashedBytes = hasher.ComputeHash(unhashedPassword);
var hashedPassword = Convert.ToBase64String(hashedBytes);
return hashedPassword;
}
public Dictionary<int, string> GetIdStringCollectionFromTable(string tableName)
{
var hasehdPassword = GetHashedPassword("myClearPassword");
var connectionString = string.Format(ConnectionStringFormat, hasehdPassword);
MySqlConnection conn = new MySqlConnection(connectionString);
conn.Open(); // >>>>> ERROR !!!!!!!!
var sqlCommand = "select id, name from {0}".Fill(tableName);
MySqlCommand command = new MySqlCommand(sqlCommand, conn);
var reader = command.ExecuteReader();
Dictionary<int, string> list = new Dictionary<int, string>();
while (reader.Read())
{
int id = reader.GetInt32(0);
string text = reader.GetString(1);
list.Add(id, text);
}
return list;
}
但是我得到了同样的错误。问题在哪里?
PS。
在SQL服务器上,old_passwords
变量设置为ON
(默认值为 OFF )。我们不控制服务器,所以这个变量应保持不变。
NB。
同一个标题有很多问题。但请不要将此问题视为重复,因为问题的背景不同。对于上面的代码,我主要受this answer启发...
答案 0 :(得分:1)
首先,关于身份验证的一些事情;
在开发应用程序时通常使用两种类型的身份验证:
数据库身份验证 - 这是应用程序验证访问数据库的方式
用户身份验证 - 这是用户对您的应用程序进行身份验证的方式
您链接到上面的文章是关于用户身份验证,而您的问题实际上是关于数据库身份验证。
MySQL使用的原始哈希算法(4.1之前的版本)被认为是不安全的。 4.1版实现了一种新的哈希算法。连接字符串中的密码不需要进行哈希处理,在对数据库进行身份验证期间,会在.Net连接器内部执行哈希处理(这是为您完成的)。问题是,如果您已从4.1之前的版本升级数据库而未重置密码以使用新的散列。
你可以做两件事中的任何一件来纠正这种情况。这些脚本在数据库中运行。
SET old_passwords = TRUE
SET old_passwords = FALSE
SET PASSWORD = PASSWORD('your_new_password_here')
建议使用第二种方法并使用新的哈希算法,因为它使您的数据库访问更安全。