Сохранение паролей членства ASP.Net при смене ключа компьютера - PullRequest
3 голосов
/ 03 ноября 2010

Существует ли утилита или пример кода, который может расшифровывать со старым ключом, а затем шифровать пароли новым ключом для пользователей, участвующих в ASP.Net?

Ответы [ 3 ]

2 голосов
/ 11 апреля 2014

Ни один из упомянутых обходных путей не помог мне. Мое решение ниже. Сначала необходимо сохранить пароли в виде открытого текста, а затем снова зашифровать их с помощью нового ключа MachineKey.

Смена ключа машины

1 голос
/ 16 ноября 2010

Это мое лучшее предположение о решении, но у меня не было возможности проверить его.Он полагается на следующие настройки для вашего текущего провайдера:

enablePasswordRetrieval="true" requiresQuestionAndAnswer="false" passwordFormat="Encrypted"

Также предполагается, что новый machinekey уже находится в файле конфигурации.

Создайте следующий класс (спасибо mootinator зана этом)

using System.Reflection;
using System.Web.Configuration;
using System.Web.Security;
namespace MyNamespace
{
    public class MySqlMembershipProvider : SqlMembershipProvider
    {
        protected override byte[] DecryptPassword(byte[] encodedPassword)
        {
            MachineKeySection section = (MachineKeySection)WebConfigurationManager.GetSection("system.web/machineKey");
            section.DecryptionKey = "oldkey"; // TODO: Set your old key here

            MethodInfo method = typeof(MachineKeySection).GetMethod("EncryptOrDecryptData", BindingFlags.Instance | BindingFlags.NonPublic);

            return (byte[])method.Invoke(section, new object[] { encodedPassword, null, 0, encodedPassword.Length, 0, false, false });
        }
    }
}

В вашем web.config:

<membership defaultProvider="DefaultSqlMembershipProvider">
  <providers>
    <clear/>
    <add name="DefaultSqlMembershipProvider" connectionStringName="MembershipConnectionString" enablePasswordRetrieval="true" requiresQuestionAndAnswer="false" applicationName="TODO" passwordFormat="Encrypted" type="System.Web.Security.SqlMembershipProvider"/>
    <add name="MySqlMembershipProvider" connectionStringName="MembershipConnectionString" enablePasswordRetrieval="true" requiresQuestionAndAnswer="false" applicationName="TODO" passwordFormat="Encrypted" type="MyNamespace.MySqlMembershipProvider"/>
  </providers>
</membership>

Измените пароли следующим кодом:

MembershipProvider retrievePasswordProvider = Membership.Providers["MySqlMembershipProvider"];

foreach (MembershipUser user in Membership.GetAllUsers())
{
    MembershipUser retrievePassworedUser = retrievePasswordProvider.GetUser(user.UserName, false);
    string password = retrievePassworedUser.GetPassword(); // get password using old key

    user.ChangePassword(password, password); // change password to same password using new key
}

Дайте мне знать, еслиработает для вас.

0 голосов
/ 03 ноября 2010

Я думаю, вы могли бы сделать это, установив ключ на лету:

Возможно, вам придется расширить SqlMembershipProvider (или что вы используете), чтобы получить доступ к методу protected DecryptPassword.

    MachineKeySection section = (MachineKeySection)WebConfigurationManager.GetSection("system.web/machineKey");

section.DecryptionKey = "old";
// Read old password
section.DecryptionKey = "new";
// Store new password
...