2010-11-03 97 views

回答

0

我想你可以通過設置在飛行的關鍵做到這一點:

您可能需要延長SqlMembershipProvider(或任何你使用),以獲得訪問protected DecryptPassword方法。

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

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

這是我最好的解決方案,但我沒有機會去測試它。它依賴於當前提供商的以下設置:

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

它還假定新的機器密鑰已在配置文件中。

創建下面的類(感謝mootinator查找有關此則JumpStart)

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:

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 
} 

<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> 

變化用下面的代碼密碼

讓我知道,如果這對你有用。

+0

不錯,如果這樣做的話,它可以避免寫入到我最終做的中間位置。我會測試一下。 – ScottS 2010-11-16 20:08:34

+0

我希望它的作品,因爲它是一個熊找出:) – Greg 2010-11-16 20:13:09

+0

section.DecryptionKey =「oldkey」;是隻讀的,不能設置..除非有辦法覆蓋它,我最終檢索/解密首先保存到文件,然後更改密鑰和更新密碼。 – Jack0fshad0ws 2016-11-08 02:09:56

2

沒有提到的解決方法適用於我。 我的解決方案如下。它首先涉及以明文存儲密碼,然後使用新的MachineKey重新加密。

Machine Key Change