*不是*使用asp.net会员提供商是个坏主意吗?

时间:2010-06-03 19:18:40

标签: asp.net security asp.net-membership

使用内置的asp.net会员提供商通常是一个非常糟糕的主意吗?

我总是为我的asp.net应用程序(面向公众)推出自己的应用程序,并且确实没有遇到任何问题。它起作用,似乎避免了一层复杂性。我的需求非常基本:一旦设置,用户必须使用电子邮件地址和密码登录,如果忘记了,它将通过电子邮件发回给他们(一个新的)。设置完成后,每个用户帐户都需要做很少的工作,但我需要为每个用户存储几个额外的字段(全名,电话和其他一些字段等)。需要登录凭据的用户数量很少(通常只是管理员和一些备份),其他所有人都使用未经身份验证的站点。

通过跳过asp.net会员提供程序功能,我可能错过了哪些大优势?

9 个答案:

答案 0 :(得分:24)

滚动您自己的身份验证系统从不是一个好主意。有很多方法可以解决问题仍然似乎在测试中工作,直到一年后当你发现你的网站在六个月前被破解时。

始终尽可能地利用您的平台为您提供的安全代码,无论是asp.net还是其他任何东西。这样做,系统由具有更多部署的供应商提供支持,以便更容易找到并修复错误,即使您遇到问题,也可以在老板提出问题时将责任归咎于供应商。更不用说一旦您第一次使用供应商的解决方案,其他部署将更快。这是正确的做法。

ASP.Net会员提供商远非完美,但我向您保证,最好从头开始构建它。

答案 1 :(得分:13)

provider model are outlined here的优点,但简而言之:

  1. 构建某些开箱即用的Web控件是为了使用成员资格提供程序模型,例如Login control/view和创建用户向导。因此,如果没有编写任何代码,您就会错过完成所有页面的登录仪表板的一步配置。

  2. 可以通过web.config文件中的简单更改来交换提供程序。并不是说你不能写自己的登录资料来做同样的事情,但是你可以在不久的将来编写自定义提供程序并将其切换到你的应用程序而不需要改变应用程序中的东西。

  3. 提供了所有基础知识。默认成员资格提供程序具有密码检索,帐户锁定,多种密码加密方法,有效的密码限制规则配置和用户管理,所有这些都是开箱即用的。单独使用它可以大大减少大多数人从头开始创建ASP.Net应用程序的设置时间。

  4. 您的应用程序的一个重要组件已经过审核。您无需担心调试所有自己的身份验证代码!这意味着当存在错误时,您通常会在站点中断之前获得修复程序,并且如果没有错误,您就可以将错误归咎于此。

答案 2 :(得分:12)

我同意Ayende's feelings about this

  
    

这是一个庞大的API,它做了很多假设,根据它给你的东西以及你必须实现的东西,它真的不好用

  

这也是我的经验。任何时候我都实现了自己的成员资格提供者(在撰写本文时两次)我将绝大多数被覆盖的方法都未实现,因为我永远不会打电话给他们而我没有使用任何网络表单使用它们的控件。

如果Sql和Active Directory提供商满足您的所有需求,那么它们就非常棒。但如果他们不这样做,并且您正在考虑实施提供者,那么可能有更好的方法。

不要将MembershipProvider与FormsAuthentication混淆,我仍然经常依赖我的应用程序。这是一种机制,负责将用户的身份验证令牌包装在cookie中并在客户端和服务器之间传递。据我所知,FormsAuthentication没有任何问题,我也不建议重新发明它。

如果您不想实施数十个MembershipProvider methodsRoleProviderMethodsProfileProvider methods,那么只需实施IPrincipalIIdentity即可。需要做。 Here's an example让这两个接口使用FormsAuthentication,这很简单。

另外,请注意,您需要聪明地存储用户的凭据。 SqlMembershipProvider 确实至少可以存储哈希盐渍密码。确保你至少做同样的事情。 Here's a nice piece of code帮助解决这个问题。请注意the slow hashing algorithm used。不要吸毒。

更新(2013-12-16)

自从我写这篇文章以来,ASP.net的情况发生了变化。 ASP.NET Identity取代之前的成员资格功能。

我的建议是使用新内容,因为:

  • 您可以实施各种界面来构建满足您需求的解决方案。这意味着您可以实现所需的部件,并忽略您不需要的部件。
  • 您可以完全更改存储身份数据的位置/方式,同时保留控制密码散列方式的默认实现。
  • OAuth和OpenID功能。
  • 您可以在任何基于OWIN构建的框架中使用相同的系统。

API稍微复杂一些,但更灵活。

答案 3 :(得分:4)

如果您的解决方案正常,请坚持下去。 “如果有效,请不要修复”以及所有这些。否则,请考虑会员API的编程时间,QA小时数和用户小时数是您自己想出的任何数量的数千倍。

答案 4 :(得分:4)

答案 5 :(得分:3)

会员资格还有会员资格(登录,电子邮件,密码及其周围的功能)。 Aspnet将成员资格与个人资料分开,并且可以集成。简介就是你称之为“额外领域”的一切。 即使您没有会员资格,也可以拥有一些自定义的简介。例如,用户可以设置首选项,返回站点,但仍然拥有它们,但仍然不注册。然后,当您注册时,可以迁移匿名配置文件并将其与您的新成员关联。

这是你跳过它时基本上错过的。

此外,如果您选择使用内置或第三方控件来使用会员资格和个人资料,那么您也会错过它。

您可以实现提供程序,而不是一次性删除提供程序模型。

答案 6 :(得分:2)

在您的情况下,经过身份验证的用户是例外情况,而不是常态用户,因此滚动自己的用户可能并没有什么坏处。

.net提供的一件事就是强制攻击防范,如果有人试图强行管理密码,管理员帐户将被锁定。

答案 7 :(得分:2)

我对内置ASP.Net身份验证的复杂性感到痛苦。我厌倦了为我永远不会使用的功能编写代码。 (以及留下一堆NotImplemented函数)。我也厌倦了使用除GUID之外的其他东西以及在每个页面加载时进行多次数据库往返的困难(仅用于身份验证)...所以,我自己动手了。它被命名为FSCAuth并且它已获得BSD许可。

我已经比ASP.Net的内置身份验证更加困难了。所有的cookie处理和实际散列都留给了FSCAuth的核心,而您只需要担心的是将用户存储在数据库中并控制需要对哪些页面进行身份验证。

如果您正面临ASP.Net的内置身份验证问题并自行推出,我建议您首先查看我的身份验证库,如果不是仅仅将其作为起点。

答案 8 :(得分:1)

如何保存用户密码?如果你用纯文本保存,这是一个主要的风险。 ASP.NET Membership系统的一个优点是它可以通过散列加密来加密密码。