ASP.NET成员资格 - 从成员资格表中检索密码和PasswordSalt - 哈希用户ID

时间:2010-04-30 02:14:28

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

我非常接近完成这个项目。我需要从我的会员表中检索密码和密码,并将其与我的'OldPasswords'表进行比较。

问题是会员提供商不允许我使用GetPassword方法,因为密码是经过哈希处理的。

我无法在正常的sqlConnection中检索它,因为UserID也经过哈希处理。

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

或者可能有不同的方法来获取这些数据?

感谢任何帮助。

谢谢,

史蒂夫

2 个答案:

答案 0 :(得分:7)

史蒂夫,UserId没有哈希。您可能会将UserName与UserId(ProviderUserKey)混淆,后者是Guid。

在您的其他问题的上下文中:您应该在用于创建新用户的代码中引用此代码,以便在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 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 

答案 1 :(得分:3)

这里似乎有几件不同的事情......

  • 您无法恢复哈希密码。期。散列的目的是阻止这种恢复。

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

  • 绝对不会被哈希处理,否则它无法使用。在散列之前,盐会附加到明文密码上,因此您在盐柱中看到的任何值都是盐。