使用asp.net成员资格的优缺点是什么?

15

我正在建立一个新网站,我的朋友建议我使用asp.net会员身份验证(登录、注册、密码恢复等)。

我发现所有东西都存储在XML文件中。

我想知道使用会员身份验证的优缺点,而不是从头开始构建。

6个回答

29

MS登录解决方案由多个部分组成。

身份验证 - “谁可以访问您的网站”

表单身份验证 - 基本上创建一个安全的cookie,在每个请求中都会显示“我已通过身份验证!”。如果没有这个,用户将不得不在每一页上都进行登录。

  • 优点:这很好用
  • 缺点:无 - 使用它

成员资格 - 这是存储用户及其密码并验证用户凭据的方法。有几种方法可以实现:

  1. 使用SqlMembershipProvider - Microsoft提供了一个数据库来安全地存储用户/密码,并为您提供了一种验证凭据的方式。
    • 优点:
      • 较少/没有自定义代码需要维护。开箱即用
      • 与Membership控件和API配合使用
    • 缺点:
      • 您必须使用Sql Server并使用其数据库架构。(对我来说不是问题)
      • 无法控制初始生成密码的方式。它们又长又丑。
      • 随着您熟悉该技术,学习曲线较陡
  2. 创建自定义MembershipProvider - 您可以继承MembershipProvider来自定义数据存储的位置和方式。

    • 优点:
      • 您可以免费获得密码的加密/解密功能
      • 控制您存储用户的位置以及数据外观
      • 仍然可以使用Membership控件和API
    • 缺点:
      • 必须实现自己的存储解决方案
      • 您必须编写,调试和维护大量自定义代码
      • 如果添加了附加功能,则必须将提供程序转换为使用它
  3. 创建自己的身份验证方案

    • 优点:完全控制
    • 缺点:
      • 您需要创建一切,但必须调试/维护所有内容。
      • 您必须亲自控制凭据的安全性。
      • 不能使用Membership控件(这并不是很重要,因为这些控件很容易复制)
      • 不能使用Membership API
      • 授权 - "用户能做什么?"

        角色 - 角色通过Web.config提供的授权机制控制用户可以做什么,并且在网站地图上进行安全剪裁。

        1. 使用SqlRoleProvider - Microsoft提供了一个用于存储角色的数据库

          • 优点:
            • 与Web.config配合使用
            • 您可以分配多个角色给一个用户
          • 缺点:
            • 角色只是一个字符串,没有“权限层次结构”支持。这可能会使创建围绕哪些用户可以编辑其他用户的规则变得困难。
        2. 创建自定义RoleProvider - 您可以从RoleProvider继承以自定义数据存储位置和方式。

          • 优点:与Web.config配合使用
          • 缺点:
            • 必须实现自己的存储解决方案
            • 仍然只是一个字符串,与先前的解决方案一样受限制
            • 如果未正确实现,可能会执行大量数据库调用。
        3. 创建自己的身份验证方案

          • 优点:完全控制 - 在页面上进行自定义检查,并根据需要进行错误/重定向
          • 缺点:
            • 无法使用Web.config /网站地图提供的授权机制。实际上,这意味着将页面添加到文件夹(例如/Admin)不再保证该页面的安全性。

        需要注意的是,成员身份提供程序和角色提供程序可以独立选择或自定义。如果可以的话,我个人建议使用SqlMembershipProvider,并评估角色提供程序的选项。


3

我不喜欢使用会员提供程序。

当场景是“标准”时,这很有用,但在需要更多自定义规则的情况下,我认为它的效果并不好。出现了“解决方法”。

而且不需要存储在XML中,存在其他解决方案(例如数据库)。


3

缺点:

  • 你偏爱的数据存储可能不被完全支持,需要额外工作。

  • 它可能与你当前或未来的要求不匹配。

  • 相对于你自己构建的东西,你可能无法完全理解其操作细节。

优点:

  • 相较于自己构建,你可能可以节省时间。

个人建议……如果这是一个重要的项目,我会选择自己构建(当然要保留表单认证)。根据我的经验,MS提供的许多“开箱即用”的功能都很令人失望。


1
我同意大多数都很草率(我在看你,RoleProvider),但 MembershipProvider 还是相当不错的。 - Greg

2
ASP.Net Membership的好处在于你可以根据需要使用它的各种功能,你可以以不同的方式存储用户数据(正如其他人所提到的),或者只是使用ASP.Net Membership来处理会话授权和页面保护。
例如,你可以完全使用登录控件、SQLMembershipProvider后端,让ASP.Net Membership从头到尾地完成所有操作。
或者你可以将自己的用户名和密码存储在自己的数据库表中,自己验证提供的详细信息,然后仅使用“FormsAuthentication.RedirectFromLoginPage()”告诉ASP.Net Membership用户已通过身份验证,并让ASP.Net Membership控制对页面的访问。
ASP.Net Membership经过了多次实践和测试,被Microsoft内外数千个站点使用,因此你知道这段代码可靠且运行良好。如果出现问题,那么有很多实现方法可以找到它。而你自己的方法只有一个用户...

0

实际上,并不是所有的东西都必须存储在 XML 文件中。您可以使用多种方式存储成员数据,包括数据库。

您还可以使用 ASP.NET 角色/成员身份库作为自定义的起点。网络上有一些有关如何做到这一点的教程。

使用内置函数的好处是 ASP.NET 成员身份 GUI 控件几乎“只需轻点即可使用”.. ;)


0
在我看来,无论如何,.NET成员资格提供程序都是一个很好的选择。我使用它们编写了相当多的大型应用程序。如果你的架构良好,将来的版本中添加功能和更改数据就相当简单。
以下是一些背景信息,以便更好地理解我的答案。.NET中的成员资格/角色/配置文件解决方案由两部分组成:框架和提供程序。框架包括您的程序将与之交互的方法和信息。提供程序确定数据的存储方式。
我发现框架非常出色。无论您想如何与其交互,几乎没有什么是做不到的。默认实现确实为您提供了很多免费的东西。如果您使用良好的编码实践,则任何缺少的功能都会进一步减轻作为缺点。请参阅入门ASP.NET MVC应用程序,以获取包装成员资格框架的绝佳示例。
数据似乎从未按照您的意愿工作,但这不是无法解决的问题。正如其他人所说,.NET附带了许多提供者,这也是实现自己的提供者的地方。我们通常从SqlMembershipProvider进行子类化。如果某些内容不按我们的意愿工作,我们就会覆盖它。如果需要,在稍后更改数据表也不是非常困难的事情。
利用已有的东西似乎总能让我们快速启动并根据需要进行调整。实际上,对此代码的更改并不经常发生。在开始时使用Microsoft的解决方案可能不会得到最漂亮的结果,但它可以快速完成任务,并让您继续解决重要问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接