Я тоже столкнулся с этой проблемой.
В моей ситуации конечная цель состояла в том, чтобы иметь возможность динамически устанавливать connectionString (вместо жестко заданного в web.config). Я сделал это, загрузив исходный код MS для провайдеров ASP.NET и изменив некоторые внутренние функции для получения строки подключения.
Однако все это было для .NET 2.0 и выглядит так же, как код, который выложил выше Андрей. Как только я все это установил, я заметил, что не могу войти на свой сайт. Поэтому после поиска я нашел этот пост. Спасибо!
Я скачал код .NET Framework 4.0 и (если кто-то хочет знать) вот новая версия метода EncodePassword. Я планирую скопировать это в мою старую версию SqlMembershipProvider, чтобы я мог использовать новые методы шифрования и снова иметь возможность войти на свой сайт ASP.NET 4.0!
private string EncodePassword(string pass, int passwordFormat, string salt)
{
if (passwordFormat == 0) // MembershipPasswordFormat.Clear
return pass;
byte[] bIn = Encoding.Unicode.GetBytes(pass);
byte[] bSalt = Convert.FromBase64String(salt);
byte[] bRet = null;
if (passwordFormat == 1)
{ // MembershipPasswordFormat.Hashed
HashAlgorithm hm = GetHashAlgorithm();
if (hm is KeyedHashAlgorithm) {
KeyedHashAlgorithm kha = (KeyedHashAlgorithm) hm;
if (kha.Key.Length == bSalt.Length) {
kha.Key = bSalt;
} else if (kha.Key.Length < bSalt.Length) {
byte[] bKey = new byte[kha.Key.Length];
Buffer.BlockCopy(bSalt, 0, bKey, 0, bKey.Length);
kha.Key = bKey;
} else {
byte[] bKey = new byte[kha.Key.Length];
for (int iter = 0; iter < bKey.Length; ) {
int len = Math.Min(bSalt.Length, bKey.Length - iter);
Buffer.BlockCopy(bSalt, 0, bKey, iter, len);
iter += len;
}
kha.Key = bKey;
}
bRet = kha.ComputeHash(bIn);
}
else {
byte[] bAll = new byte[bSalt.Length + bIn.Length];
Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);
bRet = hm.ComputeHash(bAll);
}
} else {
byte[] bAll = new byte[bSalt.Length + bIn.Length];
Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);
bRet = EncryptPassword(bAll, _LegacyPasswordCompatibilityMode);
}
return Convert.ToBase64String(bRet);
}
Edit: Попытка скопировать этот метод в старую версию SqlMembershipProvider была плохой идеей. Слишком многое изменилось. (