C# 将一个表乘以self并得到一个字段的含义是什么?
这是WebMatrix.WebData.SimpleMembershipProvider.GetHashedPassword的源代码:C# 将一个表乘以self并得到一个字段的含义是什么?,c#,sql-server,asp.net-membership,webmatrix,C#,Sql Server,Asp.net Membership,Webmatrix,这是WebMatrix.WebData.SimpleMembershipProvider.GetHashedPassword的源代码: private string GetHashedPassword(IDatabase db, int userId) { var pwdQuery = db.Query(@"SELECT m.[Password] " + @"F
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;
}
你可以在网上找到它
并通过.net reflector检查WebMatrix.WebData.dll
如果您检查代码,您可以看到一个用户表乘以self并通过运行query获得密码字段,其简单方式如下:
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
始终是“网页\会员”。因此,查询实际上解析为(假设UserTableName
设置为“Users”,userId
为“1”):
我认为数据实际上是在两个不同的表之间分离的,这有助于确保它为所有角情况获得正确的值。具体地说,我认为这有助于确保它不会为[用户
]中不再存在的用户从网页(u Membership
)中检索哈希密码(尽管我希望如果用户从系统中删除,这两个条目都会被删除,但可能只是为了避免恶意使用而进行的双重检查)
编辑:也许它还允许使用多个“用户”表,并为一个/多个应用程序共享相同的成员资格。因此,不同的“用户”表通常可能为不同的应用程序保留不同的信息,但“网页\用户成员”在所有应用程序中维护一组全局用户/密码。当为特定应用程序设置MembershipProvider时,这会阻止不属于其他应用程序的用户访问哈希密码
也就是说,用户属于ApplicationA和ApplicationB,但不属于ApplicationC。每个应用程序都有自己的“用户”表。ApplicationA/ApplicationB中的成员资格提供程序可以访问用户的哈希密码,但ApplicationC的成员资格提供程序不能。但是稍后,用户可能会将他们的帐户与ApplicationC“链接”,此时一个条目被添加到ApplicationC.Users表中,
GetHashedPassword
返回一个有效的结果。有趣的是,我认为这个函数的程序员是noob:p!!
SELECT m.[Password]
FROM webpages_Membership m, [Users] u
WHERE m.UserId = 1 AND m.UserId = u.[UserID]