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

4
我距离完成这个项目很近了。我需要从我的Membership表中检索密码和passwordSalt,以便与我的“旧密码”表进行比较。
问题是Membership提供程序不允许我使用GetPassword方法,因为密码已经被哈希处理了。
而且我无法在普通的sqlConnection中检索它,因为UserID也已经被哈希处理了。
有人知道如何对UserID进行哈希处理,这样我就可以将其放入where子句中吗?
或者也许有一种不同的方式来获取那些数据?
任何帮助都将不胜感激。
谢谢,
Steve

你有EnablePasswordRetrieval的相关设置吗? - Raj Kaimal
用户ID也被哈希了,您能确认一下吗? - Raj Kaimal
这是Membership表中UserID的样子:e7eaa11e-a6a3-4639-8369-5c507a601bb7,我不确定它是加密、哈希还是Guid。Membership文档相当稀少。 - Steve
Steve - 这是一个 GUID,应该是 UserId(ProviderUserKey)的样子。你正在混淆 UserId 和 UserName。 - Sky Sanders
Sky - 这是唯一的字段,没有用户名字段。 - Steve
你在看哪个表?用户和会员表都有UserId(Guid)和UserName / LoweredUserName(string)。 - Sky Sanders
2个回答

8

Steve,UserId没有被哈希。你可能把UserName和UserId(ProviderUserKey)混淆了,后者是一个Guid。

在你的其他问题中:你应该在创建新用户的代码中引用这段代码,以记录初始密码哈希值、盐和格式,并在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
1
@Steve - 嗯...... 在这个回答和我的其他回答旁边放一个闪亮的金色勾号会帮助人们准确找到正确的答案,是吧?;-) - Sky Sanders
当然可以,抱歉,我还是新手,对这里的工作方式不太熟悉。非常酷。 - Steve

3

这里似乎有几件事情需要注意...

  • 你无法恢复哈希后的密码。哈希的目的是为了防止这种恢复。

  • 如果用户ID在数据库中已经以某种方式被哈希,你可以对其进行哈希查找(尽管这有点奇怪,没有充足的理由去哈希一个用户ID)。但你需要知道如何进行哈希。如果是MD5或SHA1,最快的方法是使用FormsAuthentication.HashPasswordForStoringInConfigFile(但要将其应用于用户名而不是密码)。

  • 盐值绝不能被哈希,否则它就无法使用。盐值会在哈希之前附加到明文密码,因此你在盐列中看到的任何值都是盐值。


是的,在之前的帮助下,我终于能够正确地生成哈希值来对比密码和我的表格了。但是现在我注意到用户名也被加密了,使用相同的哈希函数无法得到匹配结果。 - Steve
@steve - 用户名不应该被搞乱。似乎出了些问题。 - Sky Sanders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接