c# - 用于超大型应用程序的 ASP.NET 自定义成员身份提供程序

标签 c# sql asp.net-mvc authentication asp.net-membership

我必须为一个非常大的网站想出一个成员(member)解决方案。该站点将使用 ASP.NET MVC 2 和 MS SQL2008 数据库构建。

当前的成员(member)提供程序似乎有点矫枉过正,功能太多了。

我只想存储电子邮件/密码和基本个人资料信息,例如名字/姓氏、电话号码。我将只需要 2 个角色,管理员和用户。

考虑到可能有数百万用户注册,您对这种情况有何建议? StackOverflow 使用什么?

我过去经常使用现有的 Membership API,并将其扩展为存储附加信息等。但是有一些表格,例如

aspnet_Applications
aspnet_Paths
aspnet_SchemaVersions
aspnet_WebEvent_Events
aspnet_PersonalizationAllUsers
aspnet_PersonalizationPerUser

这是非常多余的,我从来没有找到用处。

编辑
只是为了澄清@drachenstern 回答后的一些其他冗余,在 Membership/Users 表中还有一些我没有用到的额外列,但它们会添加到每个 select/insert 语句的负载中。

  1. 手 secret 码
  2. PasswordQuestion/PasswordAnswer (我将进行基于电子邮件的密码恢复)
  3. IsApproved (用户将始终获得批准)
  4. 评论
  5. 手机别名
  6. 用户名/LoweredUsername (或电子邮件/LoweredEmail) [电子邮件是用户名,因此只需要其中之一]

此外,我听说 GUID 并不是那么快,我更愿意使用整数来代替(就像 Facebook 那样),这也会被公开。

我如何着手创建自己的Membership Provider,重新使用一些 Membership APIs(验证、密码加密、登录 cookie 等) 但只有满足我要求的表格?

非常欢迎链接到文章和现有实现,我的 Google 搜索返回了一些非常基本的示例。

提前致谢
马尔科

最佳答案

@Marko 我当然可以理解标准成员(member)系统可能包含比您需要的更多的功能,但事实是这真的无关紧要。成员(member)系统的某些部分您不会使用,就像您不会使用 .Net 的某些部分一样。 .Net 可以做很多您永远不会用到的事情,但您不会通过 .Net 并剥离该功能,对吗?当然不是。你必须专注于对你想要完成的事情很重要的事情,并从那里开始工作。不要陷入分析的瘫痪状态。你会浪费你的时间,转动你的轮子,最终不会得到比已经为你创造的更好的东西。现在微软确实有时会犯错,但他们确实做对了很多事情。您不必拥抱他们为实现您的目标所做的一切 - 您只需要了解什么对您的需求很重要。

至于Guids和ints作为主键,让我解释一下。主键和聚集索引之间有一个重要的区别。您可以在不属于主键的列上添加主键和聚集索引!这意味着如果按名称(或其他名称)排列数据更为重要,您可以自定义聚簇索引以准确反射(reflect)您的需要,而不会影响您的主键。让我换一种说法——主键和聚簇索引不是一个。我写了一篇关于如何向表中添加聚簇索引和主键的博文。聚簇索引将按照您需要的方式对表行进行物理排序,而主键将强制执行您需要的完整性。请查看我的博客文章,了解具体如何操作。

这是链接 - http://iamdotnetcrazy.blogspot.com/2010/09/primary-keys-do-not-or-should-not-equal.html .

其实很简单,你只需要先添加聚簇索引,然后再添加主键。必须按照那个顺序完成,否则你将无法完成。当然,这假定您使用的是 Sql Server。大多数人没有意识到这一点,因为 SQL Server 默认会在您的主键上创建聚集索引,但您所要做的就是先添加聚集索引,然后再添加主键,您就可以开始了。随着数据库和服务器系统的扩展,使用 int 作为主键会变得非常有问题。我建议使用 Guids 并添加聚簇索引以反射(reflect)您实际需要存储数据的方式。

现在,总而言之,我只是想告诉您去创造一些伟大的东西,不要被表面的细节所困扰,这些细节不会给您带来足够的性能提升,而实际上并不重要。生命太短暂。另外,请记住,您的系统只能与其最慢的代码段一样快。因此,请务必查看实际占用大量时间的事情并处理好这些事情。

还有一件事。你不能把你在网上看到的一切都当真。技术随着时间的推移而变化。有时,您可能会查看某人很久以前写的问题的答案,但今天已不再相关。此外,人们会回答问题并向您提供信息,而无需实际测试他们所说的内容是否属实。您可以为您的应用程序做的最好的事情就是对其进行压力测试。如果您使用的是 ASP.Net MVC,则可以在测试中执行此操作。您可以做的一件事是添加一个 for 循环,在您的测试中将用户添加到您的应用程序,然后进行测试。这是一个想法。还有其他方法。您只需要付出一点努力就可以将您的测试设计得很好或至少足以满足您的目的。

祝你好运!

关于c# - 用于超大型应用程序的 ASP.NET 自定义成员身份提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4175266/

相关文章:

mysql - 高级查询运行缓慢

sql - 使用 sqlite 中的单个选择更新一行中的多个列

asp.net-mvc - DAL 中的 app.config 和 Web 应用程序中的 web.config

c# - "redundant comma in array initializer"为什么要修复

c# - 转换失败 : IList<T> to Custom Class implementing ICollection<T>

php - 如何获得一个空的关联数组?

asp.net-mvc - 是否需要特定的 IIS 配置才能允许 .Net 4.0 ASP.Net MVC 2 Azure 应用程序正常运行?

asp.net-mvc - NHibernate.Validator 与 DataAnnotations

c# - 我可以根据项目自动将测试分配到测试列表吗?

c# - WebActivatorEx 在应用程序启动时导致 ArgumentException