【问题标题】:ASP.NET Membership: to be or not to be?ASP.NET 成员资格:成为还是不成为?
【发布时间】:2010-06-20 22:44:08
【问题描述】:
我正在考虑如何使用 ASP.NET 和 MVC2 实现授权和身份验证。让我们将其称为用户系统。
我在野外见过三种解决方案:
我一直在阅读您的想法,许多人说如果您不注意安全细节,尝试推出您自己的“用户系统”可能会更加危险。另一方面,解决方案要简单得多。一切都可能存储在一个数据库中,而用户特定的东西则在一个用户表中。此解决方案的开销似乎很低。
使用 ASP.NET 成员资格解决方案允许使用许多开箱即用的功能,但恕我直言,真的令人困惑。您可能需要将会员资料存储在其自己的数据库中,并且能够以某种方式将用户实体从您的站点特定数据库链接到 ASP.NET 数据库。
如果您使用的是 ASP.NET 成员身份
- 您的数据库架构是什么样的?您如何与 ASP.NET 成员用户(即 Songs FavoriteSongs ( SiteUsers) aspnet_Users)建立外部关系?
- 您为什么不自己推出?
如果你自己滚动
- 您使用了什么样的用户系统抽象层(如果有)?
- 您为什么不使用 ASP.NET 成员资格?
分析这些可能性时,我真的很困惑。请从这个粘稠的会员瘫痪网络中将我踢向正确的方向!谢谢。
【问题讨论】:
标签:
authentication
asp.net-mvc-2
asp.net-membership
authorization
【解决方案1】:
内置的会员服务提供商已经很安全了,而且真的很容易使用。您可以在几个小时内启动并运行内置会员资格。或者(取决于您正在构建的应用程序类型)您也可以使用 StackOverflow 使用的OpenID 进行检查。
此外,使用内置的 Membership Provider,创建关系就像使用“唯一标识符”将 aspnet_User 表(我不记得确切的名称)与相关表关联起来一样简单。
我将我所有的会员“资料”存储在与系统数据库相同的数据库中,它从来没有误导我。创建会员“东西”也很容易。只需针对您希望拥有 asp.net 成员资格的数据库运行 aspnet_regsql.exe
Here's another SO question 同理。
【解决方案2】:
许多人选择不推出自己的身份验证系统是有充分理由的!这是非常危险的,有很多小方法可以让你弄错并让你的网站容易受到攻击。
但是,我是那些冒险者中的一员,并且确实自己动手了。我仔细检查了每一行代码是否存在安全漏洞,到目前为止,自从我发布了身份验证系统 1.0 以来,我还没有修补任何安全漏洞。无论如何,我的身份验证系统被命名为FSCAuth 并获得 BSD 许可。
我不太清楚你的意思。我基本上有一层用户数据被检索和写入/从数据库中。 FSCAuth 实际处理 cookie 和 HTTP 身份验证的一层。而且,您告诉 FSCAuth 的一层是“嘿,只有当当前用户在管理员组中时才能看到此页面”。
我的 UserData 类非常简单,只需要 4 个字段:Username、PasswordHash、UniqueID 和 Salt。这就是 FSCAuth 所依赖的。如果您需要更多字段,您可以从 UserData 类继承,它的工作原理是一样的。
我发现内置的 ASP.Net 身份验证有很多缺点
- 如果您想使用内置会员提供程序以外的任何东西,则必须编写大量代码
- 有时您必须自己处理 cookie,我认为这很危险
- 几乎不可能使用 Blowfish 散列算法
- 每次页面加载都会多次往返数据库
- 有状态的会话(当用户登录时,记录会被放入数据库)使得扩展到多台服务器变得更加困难,并且通常会给您的数据库服务器带来更多不必要的压力。
- 细粒度的身份验证(可以看到 A 的电子邮件,但看不到 B 的电子邮件)比我想要的要困难
- GUID
其中许多问题是设计使然,我相信这是试图制作一款满足所有人的软件的症状。
好吧,在 FSCAuth 中,我在设计上遗漏了很多东西,老实说,它不可能适合每个人......但在许多常见场景中,它比 ASP.Net 成员资格更容易使用。可以在阳光下使用几乎任何散列算法。用于身份验证的单个数据库命中。无状态登录。唯一 ID 可以是任何适合字符串的内容。等等。
因此,如果您在解决 ASP.Net 的内置身份验证和自行开发身份验证之间犹豫不决,请先看看 FSCAuth。如果不出意外,它是您自己滚动的一个很好的起点。