代码之家  ›  专栏  ›  技术社区  ›  Andrea Turri

使用asp.net成员资格的利弊是什么?

  •  15
  • Andrea Turri  · 技术社区  · 14 年前

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

    我看到所有东西都存储在一个XML文件中。

    我想知道使用会员制而不是从头开始构建东西的利弊。

    6 回复  |  直到 14 年前
        1
  •  29
  •   Greg    14 年前

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

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

    表单身份验证 -这基本上创建了一个安全的cookie,上面写着“我已通过身份验证!”每一个请求。如果没有这个,用户将不得不登录每个页面。

    • 优点:效果很好
    • 缺点:没有-使用它

    会员 -这是存储用户及其密码并验证用户凭据的方式。有几种方法可以做到这一点:

    1. 使用SqlMembershipProvider -Microsoft为您提供了一个安全存储用户/密码的数据库,并为您提供了一种验证凭据的方法。
      • 赞成的意见:
        • 更少/没有要维护的自定义代码。作品“开箱即用”
        • 使用成员资格控件和API
      • 欺骗:
        • 必须使用Sql服务器并使用其数据库架构。(在国际海事组织不是问题)
        • 无法控制最初如何生成密码。它们又长又丑
        • 当你熟悉这项技术时,学习曲线会变陡
    2. 创建自定义成员资格提供程序 -您可以从MembershipProvider继承,以自定义存储数据的位置和方式。

      • 赞成的意见:
        • 您可以免费获得密码的加密/解密
        • 控制用户的存储位置和数据的外观
        • 您仍然可以使用成员资格控件和API
      • 欺骗:
        • 必须实施自己的存储解决方案
        • 您必须编写、调试和维护许多自定义代码
        • 如果添加了其他功能,则必须强制转换提供程序才能使用它
    3. 创建自己的身份验证方案

      • 优点:完全控制
      • 欺骗:
        • 您可以创建所有内容,但必须调试/维护所有内容。
        • 你必须自己控制凭证的安全性。
        • 无法使用成员资格控件(这不是很大的损失,因为控件很容易复制)
        • 无法使用成员资格API

    授权-“用户能做什么?”

    角色 -角色控制用户可以通过 authorization mechanism provided by the web.config 同时也可以在站点地图上进行安全修整。

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

      • 赞成的意见:
        • 使用web.config
        • 可以为用户分配多个角色
      • 欺骗:
        • 角色只是一个字符串,不支持“权限层次结构”。这会使创建用户可以编辑其他用户的规则变得困难。
    2. 创建自定义角色提供程序 -您可以从RoleProvider继承来自定义数据的存储位置和方式。

      • 优点:使用web.config
      • 欺骗:
        • 必须实施自己的存储解决方案
        • 仍然只是一个字符串,与前面的解决方案一样有限
        • 如果不正确实现,它可能会执行很多数据库调用。
    3. 创建自己的身份验证方案

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

    需要注意的是,成员资格和角色提供者可以彼此独立地选择或定制。如果可以的话,我个人建议使用SqlMembershipProvider并评估角色提供程序的选项。

        2
  •  3
  •   19WAS85    14 年前

    我不喜欢使用会员服务提供商。

    当场景是“标准”时,这是util,但是在需要更多自定义规则的情况下,我认为这样做不太好。出现“解决方案”。

    而不需要存储在XML中,存在另一种解决方案(数据库,用于Expple)。

        3
  •  3
  •   UpTheCreek    14 年前

    欺骗:

    • 您首选的数据存储可能不完全支持即开即用

    • 它可能与您当前或未来的需求不匹配

    • 你可能不完全理解它是如何工作的(对你自己建立的东西)

    赞成的意见:

    • 比起自己滚,你可能会节省时间。

    就个人而言。。。 如果这是一个严肃的项目,我会滚动你自己(但当然保持形式认证)。根据我的经验,微软的许多“开箱即用”功能都相当不被认可。

        4
  •  3
  •   Moo    14 年前

    关于ASP.Net成员资格的好处是,您可以随心所欲地使用多个或少个成员资格—您可以以各种形式存储用户数据(如其他人所述),也可以仅使用ASP.Net成员资格来处理会话授权和页面保护。

    例如,您可以全力以赴,使用登录控件SQLMembershipProvider后端,让ASP.Net成员身份端到端地完成所有事情。

    或者,您可以将自己的用户名和密码存储在自己的数据库表中,自己验证提供的详细信息,然后只需使用“FormsAuthentication.RedirectFromLoginPage()”告诉ASP.Net成员身份该用户已通过身份验证,并拥有ASP.Net成员身份,然后控制对页的访问。

    ASP.Net成员资格是经过尝试和测试的,微软内外的数千个网站都在使用它,所以您知道这些代码工作正常。如果有问题,那么有很多实现可以找到它。你自己的方法只有一个用户。。。

        5
  •  1
  •   Christian Wattengård    14 年前

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

    您还可以使用ASP.NET角色/成员资格库作为滚动您自己的角色/成员资格库的起点。在interwebs上有一些关于如何做到这一点的教程。

    使用内置函数的优点是,ASP.NET成员资格gui控件或多或少“工作正常”。。;)

        6
  •  1
  •   Chuck    14 年前

    在我看来,.NET会员服务提供商是一个很好的选择。我已经用它们编写了很多大型应用程序。如果您的体系结构很好,那么在将来的版本中添加功能和更改数据就相当简单。

    这里有一点上下文框架我的答案。NET中的成员/角色/配置文件解决方案由两部分组成:框架和提供程序。框架由程序将要与之交互的方法和信息组成。提供者决定如何存储数据。

    我发现这个框架很好。无论你想如何与之互动,都没有什么是你做不到的。默认实现确实免费提供了很多。如果您使用的是良好的编码实践,那么任何功能的缺乏都会作为一个缺点而得到进一步的缓解。请参阅starter ASP.NET MVC应用程序,以获取包装成员资格框架的优秀示例。

    数据似乎从来没有按照你想要的方式工作过,但这并不是你不能解决的问题。首先,正如人们所说,有很多供应商都是随.NET一起发布的。这也是实现您自己的提供者的作用所在。我们通常从子类开始 SqlMembershipProvider . 如果某些东西不能按我们所希望的方式工作,我们就重写它。如果需要的话,在以后的时间更改数据表并不是非常困难。

    使用已经存在的似乎总是让我们快速地进行,并根据需要进行调整。事实上,对该代码的更改并不经常发生。在一开始使用微软的解决方案可能不会带来最漂亮的工作,但它可以快速完成工作,并让您继续解决重要的问题。