2

这是 WebMatrix.WebData.SimpleMembershipProvider.GetHashedPassword的源代码:

   private string GetHashedPassword(IDatabase db, int userId)
           {
               var pwdQuery = db.Query(@"SELECT m.[Password] " +
                                       @"FROM " + MembershipTableName + " m, " + SafeUserTableName + " u " +
                                       @"WHERE m.UserId = " + userId + " AND m.UserId = u." + SafeUserIdColumn).ToList();
               // REVIEW: Should get exactly one match, should we throw if we get > 1?
               if (pwdQuery.Count != 1)
               {
                   return null;
               }
               return pwdQuery[0].Password;
           }

您可以在http://aspnetwebstack.codeplex.com/SourceControl/latest#src/WebMatrix.WebData/SimpleMembershipProvider.cs上找到它

并通过 .net 反射器检查 WebMatrix.WebData.dll

如果您检查代码,您可以通过运行查询看到一个 User 表乘以 self 并获取 Password 字段,简单的方式如下:

SELECT m.Password FROM [Users] m, [Users] u
 WHERE m.[UserID] = 1 AND m.UserID = u.UserID
4

1 回答 1

3

MembershipTableName如果您查看和之间的区别SafeUserTableName

internal static string MembershipTableName
{
    get { return "webpages_Membership"; }
}

private string SafeUserTableName
{
    get { return "[" + UserTableName + "]"; }
}

// represents the User table for the app
public string UserTableName { get; set; }

所以SafeUserTableName真的只是[UserTableName]可以单独设置,而MembershipTableName总是“ webpages_Membership ”。所以查询真正解析为(假设UserTableName设置为“用户”,userId为“1”):

SELECT m.[Password]
FROM webpages_Membership m, [Users] u
WHERE m.UserId = 1 AND m.UserId = u.[UserID]

我认为数据确实在两个不同的表之间分开,这有助于确保它为所有极端情况获得正确的值。具体来说,我认为它有助于确保它不会webpages_Membership为不再存在于 [ Users] 中的用户检索散列密码(尽管我希望如果从系统中删除用户,两个条目都会被擦除,但也许它只是一个双-检查以避免恶意使用)

编辑:也许还允许使用多个“用户”表并为一个/多个应用程序共享相同的成员资格。因此,不同的“用户”表通常可能为不同的应用程序保留不同的信息,但“webpages_Membership”在所有应用程序中维护一组全局用户/密码。当为特定应用程序设置 MembershipProvider 时,这会阻止不属于不同应用程序的用户访问散列密码。

即一个用户属于ApplicationA和ApplicationB,但不属于ApplicationC。每个应用程序都有自己的“用户”表。ApplicationA/ApplicationB 中的成员资格提供者可以访问用户的散列密码,但 ApplicationC 的成员资格提供者不能。但稍后,用户可能会“链接”他们的帐户与 ApplicationC,此时会将条目添加到 ApplicationC.Users 表并GetHashedPassword返回有效结果。

于 2013-05-18T13:17:54.797 回答