这是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
最佳答案
如果您查看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
设置为“ Users”,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
返回有效结果。