代码之家  ›  专栏  ›  技术社区  ›  ScottS

在更改计算机密钥期间维护ASP.Net成员身份密码

  •  3
  • ScottS  · 技术社区  · 14 年前

    是否有一个实用程序或代码示例可以使用旧密钥解密,然后使用新密钥为ASP.Net成员身份用户加密密码?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Gregory Suvalian    10 年前

    上面提到的解决办法都不适合我。 我的解决方案如下。它包括首先以明文存储密码,然后用新的MachineKey重新加密密码。

    Machine Key Change

        2
  •  1
  •   Greg    14 年前

    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
    }
    

    如果这对你有用,请告诉我。

        3
  •  0
  •   Kevin Stricker    14 年前

    我想你可以在飞行中设定钥匙:

    你可能需要延长 SqlMembershipProvider (或任何你使用的)进入 protected DecryptPassword 方法。

        MachineKeySection section = (MachineKeySection)WebConfigurationManager.GetSection("system.web/machineKey");
    
    section.DecryptionKey = "old";
    // Read old password
    section.DecryptionKey = "new";
    // Store new password