2010-04-30 41 views
4

我非常接近完成此項目。我需要從我的Membership表中檢索密碼和passwordSalt,以將其與我的'OldPasswords'表進行比較。ASP.NET成員資格 - 從會員表中檢索密碼和PasswordSalt - 散列用戶ID

問題是成員資格提供程序不讓我使用GetPassword方法,因爲密碼被散列。

而我無法在正常的sqlConnection中檢索它,因爲UserID也被散列。

有誰知道如何散列UserID,所以我可以把它放在我的where子句中?

或者也許有不同的方式來獲得該數據?

任何幫助表示讚賞。

謝謝

史蒂夫

+0

你有什麼對EnablePasswordRetrieval? – 2010-04-30 02:24:25

+0

「用戶ID也被哈希」 - 你能證實這一點嗎? – 2010-04-30 02:25:38

+0

以下是用戶ID在成員資格表中的樣子: e7eaa11e-a6a3-4639-8369-5c507a601bb7,我不確定它是加密的,散列還是Guid。會員文件相當稀少。 – Steve 2010-04-30 11:07:53

回答

7

Steve,UserId沒有被散列。您可能會將UserName與Guid的UserId(ProviderUserKey)混淆。

在您的其他問題的上下文中:您應該在用於創建新用戶的代碼中引用此代碼,以便在OnPasswordChanging中記錄初始密碼哈希,salt和格式AND,以便您可以檢查/拒絕/插入。

這將獲得在當前登錄用戶的相關信息:

var user = Membership.GetUser(); 
var userId = user.ProviderUserKey; 

MembershipPasswordFormat passwordFormat; 
string passwordSalt; 
string password; 

var cstring = WebConfigurationManager.ConnectionStrings["localSqlServer"]; 
using (var conn = new SqlConnection(cstring.ConnectionString)) 
{ 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = "select PasswordFormat,PasswordSalt,Password from aspnet_Membership where [email protected]"; 
     cmd.Parameters.AddWithValue("@UserId", userId); 
     conn.Open(); 
     using (var rdr = cmd.ExecuteReader()) 
     { 
      if (rdr != null && rdr.Read()) 
      { 
       passwordFormat = (MembershipPasswordFormat) rdr.GetInt32(0); 
       passwordSalt = rdr.GetString(1); 
       password = rdr.GetString(2); 
      } 
      else 
      { 
       throw new Exception("An unhandled exception of type 'DoesntWorkException' has occured"); 
      } 
     } 
    } 
} 

//do something interesting hew with passwordFormat, passwordSalt , password 
+0

你的代碼工作得很好,非常感謝你的幫助。一旦我完成了,我會發布我的所有代碼。也許別人覺得有幫助。 – Steve 2010-05-01 01:39:34

+1

@Steve - 嗯......旁邊有一個閃亮的金色複選標記,我的其他答案可以幫助人們找到正確的答案,呃? ;-) – 2010-05-01 02:43:49

+0

當然,是的,對不起,我在這裏還是新的,以及它是如何工作的。很酷。 – Steve 2010-05-01 11:07:14

3

似乎有是幾個不同的東西會在這裏......

  • 無法恢復哈希密碼。期。哈希的目的是爲了阻止恰恰是這種恢復。

  • 如果由於某種原因已經在數據庫中對用戶ID值進行散列處理(儘管這有點奇怪,沒有理由對用戶ID進行散列處理),那麼可以對用戶標識進行散列查找。但你需要知道它是如何被散列的。如果是MD5或SHA1,最快的方法是使用FormsAuthentication.HashPasswordForStoringInConfigFile(但在用戶名中使用它而不是密碼)。

  • 鹽應該絕對不能被散列,否則它是無法使用的。鹽在散列之前附加明文密碼,所以無論您在鹽列中看到的值是的鹽。

+0

是的,在以前的幫助下,我終於能夠將正確的散列組合在一起以獲得密碼並將其與我的表進行比較,但現在我注意到用戶名也是混亂的,並且使用相同的哈希函數無法獲得匹配。 – Steve 2010-04-30 11:10:06

+0

@steve - 用戶名不應該受到損壞。有什麼噁心正在發生。 – 2010-04-30 11:24:36