我应该使用用户名还是用户的ID在ASP.NET中引用经过身份验证的用户?

所以在我简单的学习网站中,我使用内置的ASP.NET身份验证系统。

我现在添加一个用户表来保存他的zip,DOB等东西。我的问题是:

  1. 在新表中,密钥应该是用户名(字符串)还是用户ID,即他们在 asp_ tables 中使用的GUID查看号码。
  2. 如果最好的做法是使用那个丑陋的指导,那么有人知道如何得到它吗?它似乎不像名称那样容易访问( System.Web.HttpContext.Current.User.Identity.Name
  3. 如果您建议我不使用(不是由ASP.NET身份验证提供的guid或userName字段),那么我如何使用ASP.NET身份验证来执行此操作?我喜欢的一种选择是使用用户的电子邮件地址作为登录名,但是如何让ASP.NET身份验证系统使用电子邮件地址而不是用户名? (或者没有什么可以做的,只是我决定我“知道”userName实际上是一个电子邮件地址?

请注意:

  • 我不是问如何在.NET中获取GUID,我只是将 asp_ tables 中的userID列引用为guid。
  • 用户名在ASP.NET身份验证中是唯一的。
0

12 答案

我同意Mike Stone。我还建议只有在您要跟踪大量数据的情况下使用GUID。否则,一个简单的自动递增整数(Id)列就足够了。

如果你确实需要GUID,那么.NET非常可爱,你可以通过一个简单的...

Dim guidProduct As Guid = Guid.NewGuid()

要么

Guid guidProduct = Guid.NewGuid();
0
额外

您应该使用一些唯一的ID,您提到的GUID或其他自动生成的密钥。但是,该数字对于用户而言永远不可见。

这样做的一个巨大好处就是所有的代码都可以在用户标识上工作,但用户的名字并没有真正绑定到它。然后,用户可以更改他们的名字(我发现它在网站上很有用)。如果您使用电子邮件地址作为用户的登录信息,这对用户非常方便(如果用户的普通用户身份是受欢迎的,那么他们不必记住20个ID),这一点尤其有用。

0
额外

我建议使用用户名作为表中的主键如果用户名将是唯一的,有几个很好的理由来做到这一点:

  1. 主键是一个聚集索引,因此通过用户名搜索用户详细信息会很快。
  2. 它会阻止重复出现的用户名
  3. 您不必担心使用两种不同的信息(用户名或GUID)
  4. 由于不必查找两位信息,它将使编写代码更容易。
0
额外
使用用户名的关键问题是用户是否因某种原因想要更改用户名。如果您使用用户名,则必须对多个表进行更改,而不是仅更改一个表。注意:发表此评论然后在下面阅读,并看到其他人提到这一点。
额外 作者 percent20,
当用户名可以随时重复使用时,会出现其他潜在问题。例如,假设您在自定义授权模型中使用用户名。用户ASmith以管理员身份进行分配。然后他离开公司,他的用户记录被删除。新用户加入公司并分配了用户名称ASmith。您可能只是在没有意识到的情况下给出该用户管理员访问权限。
额外 作者 Phil Haselden,

如果你打算使用LinqToSql进行开发,我会推荐使用Int作为主键。当我使用非Int字段构建关系时,即使nvarchar(x)字段有约束使其成为唯一字段,我也遇到了很多问题。

我不确定这是LinqToSql中的一个已知错误还是什么,但是我在当前项目中遇到了问题,我不得不在多个表上交换PK和FK。

0
额外

我也同意迈克斯通。我的公司最近为外部客户实现了一个新的用户表(与通过LDAP进行身份验证的内部用户相反)。对于外部用户,我们选择将GUID作为主键存储,并将用户名作为varchar在用户名字段中以唯一约束存储。

另外,如果您要存储密码字段,我强烈建议将该密码存储为数据库中的腌制哈希二进制文件。这样,如果有人要破解你的数据库,他们将无法访问你的客户的密码。

0
额外

你应该使用UserID。 它是MembershipUser的ProviderUserKey属性。

Guid UserID = new Guid(Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString());
0
额外
.Identity.Name后有一个额外的括号
额外 作者 Marcel Popescu,

我会使用用户标识。如果你想使用用户名,你将会使“更改用户名”功能非常昂贵。

0
额外

我会说使用UserID,所以用户名仍然可以改变,而不会影响主键。我还会将用户名列设置为唯一以停止重复的用户名。

如果您主要搜索用户名而不是用户名,请将用户名设为聚集索引,并将主键设置为非聚集。这会在搜索用户名时为您提供最快的访问权限,但是您将主要搜索UserIds,然后将其作为聚簇索引。

编辑:这也将更适合当前的ASP.Net会员表,因为他们也使用用户ID作为主键。

0
额外

我会使用一个自动递增的数字,通常是一个int。

你想保持密钥的大小尽可能小。这使您的索引变小,并且也可以使用任何外键。此外,您并未将数据设计与外部用户数据紧密耦合(这也适用于aspnet GUID)。

通常,GUID不是很好的主键,因为它们很大,插入可能发生在表内的任何数据页面而不是最后一个数据页面上。这个主要的例外是如果你正在运行多重复制的数据库。在这种情况下GUID对键很有用,但我猜你只有一个数据库,所以这不是问题。

0
额外

我同意Palmsey, 虽然他的代码似乎有点错误:

Guid UserID = new Guid(Membership.GetUser(User.Identity.Name)).ProviderUserKey.ToString());

应该

Guid UserID = new Guid(Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString());
0
额外

我会在我的代码中使用guid,并且已经提到了一个电子邮件地址作为用户名。毕竟,它对用户来说已经是独一无二的,令人难忘。也许甚至沟渠guid(诉辩论)。

有人提到在GUID中使用聚集索引(如果在代码中使用该索引)。我会避免这种情况,特别是如果INSERT高;每次插入记录时索引都会重建。尽管由于只添加新记录,聚簇索引在自动增量ID上运行良好。

0
额外

这是旧的,但我只希望找到这个的人注意一些事情:

  1. aspnet会员数据库在访问用户记录时进行了优化。在使用更低的用户名和applicationid搜索记录时,将使用sql server中的聚簇索引查找(最佳)。这很有意义,因为我们只有在用户首次发送凭证时才提供用户名。

  2. guid用户标识会给出比int更大的索引大小,但这并不重要,因为我们通常每次只检索1个记录(用户),在碎片方面,读取的数量通常大大超过写入和编辑到用户表的次数 - 人们根本不会经常更新该信息。

  3. 可以编辑创建aspnet成员资格表的regsql脚本,以便不使用NEWID作为用户标识的默认值,而是可以使用NEWSEQUENTIALID(),这可以提供更好的性能(我已经对此进行了描述)。 >

  4. 资料。有人创建一个“新的学习网站”不应该试图重新发明轮子。我曾经工作的一个网站使用了开箱即用的aspnet会员表(不包括可怕的个人资料系统),用户表包含近200万个用户记录。即使有如此多的记录,选择仍然很快,因为正如我刚才所说的那样,数据库索引集中在用于更低索引用户名和应用程序标识以聚集索引查找这些记录,并且一般来说,如果sql正在执行聚集索引查找找到1条记录,即使提供了大量的记录,也不会有任何问题,前提是您不要向表中添加列并开始回拉太多数据。

  5. 担心这个系统中的GUID,对我而言,根据系统的实际性能和经验,是不成熟的优化。如果你的userid有一个int,但是系统由于你的自定义索引设计等而执行次优查询,系统不能很好地扩展。微软的人在aspnet成员资格数据库方面做得很好,并且比将userId更改为int还有更多的工作要关注。

0
额外