【问题标题】:ASP.NET Membership - Retrieve Password and PasswordSalt from Membership Table - Hash UserIDASP.NET 成员资格 - 从成员资格表中检索密码和 PasswordSalt - 哈希用户 ID
【发布时间】:2010-04-30 02:14:27
【问题描述】:

我很接近完成这个项目。我需要从 Membership 表中检索密码和 passwordSalt 以将其与我的“OldPasswords”表进行比较。

问题是会员资格提供者不允许我使用 GetPassword 方法,因为密码是散列的。

而且我无法在正常的 sqlConnection 中检索它,因为 UserID 也被散列了。

有谁知道如何对 UserID 进行哈希处理,以便我可以将其放在 where 子句中?

或者也许有不同的方式来获取这些数据?

感谢任何帮助。

谢谢,

史蒂夫

【问题讨论】:

  • EnablePasswordRetrieval 有什么用?
  • “用户 ID 也被散列了” - 你能确认一下吗?
  • 这是会员表中 UserID 的样子:e7eaa11e-a6a3-4639-8369-5c507a601bb7,我不确定它是加密的、散列的还是 Guid。成员资格文档相当稀疏。
  • Steve - 这是一个 Guid,也是 UserId (ProviderUserKey) 的样子。您正在将 UserId 与 UserName 混为一谈。
  • Sky - 这是唯一的字段,没有 UserName 字段。

标签: c# asp.net-membership membership membership-provider


【解决方案1】:

Steve,UserId 没有经过哈希处理。您可能会将 UserName 与作为 Guid 的 UserId (ProviderUserKey) 混淆。

在您的其他问题的上下文中:您应该在用于创建新用户以记录初始密码哈希、盐和格式的代码中以及在 OnPasswordChanging 中引用此代码,以便您可以检查/拒绝/插入。

这将获取当前登录用户的相关信息:

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 UserId=@UserId";
        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 

【讨论】:

  • 您的代码运行良好,非常感谢您的帮助。完成后,我将发布所有代码。也许其他人会觉得它有帮助。
  • @Steve - 嗯.....在这个和我的其他答案旁边有一个闪亮的金色复选标记将帮助人们在正确答案上归零,嗯? ;-)
  • 是的,当然,对不起,我还是新来的,以及它是如何工作的。很酷。
【解决方案2】:

这里似乎发生了一些不同的事情......

  • 您无法恢复散列密码。时期。散列的目的是防止正是这种恢复。

  • 如果用户 ID 值由于某种原因已经在数据库中散列,您可以散列用户 ID 以进行查找(尽管这有点奇怪,没有充分的理由散列用户 ID)。但是您需要知道如何它是散列的。如果是 MD5 或 SHA1,最快的方法是使用FormsAuthentication.HashPasswordForStoringInConfigFile(但在用户名而不是密码上使用)。

  • 盐应该绝对不被散列,否则它是不可用的。盐被附加到明文密码之前散列,所以你在盐列中看到的任何值都是盐。

【讨论】:

  • 是的,在以前的帮助下,我终于能够获得正确的哈希值并获得密码并将其与我的表进行比较,但是现在我注意到用户名也被打乱了,并且使用了相同的哈希值函数无法获得匹配。
  • @steve - 用户名不应该被破坏。发生了一些奇怪的事情。
最近更新 更多