Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将一个表乘以self并得到一个字段的含义是什么?_C#_Sql Server_Asp.net Membership_Webmatrix - Fatal编程技术网

C# 将一个表乘以self并得到一个字段的含义是什么?

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

这是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;
           }
你可以在网上找到它

并通过.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]