如何避免使用会员提供程序?

8
我们正在构建一个轻量级客户端记账应用程序的架构。它应该遵循两个主要要求:
1. 应用程序应具有模块化设计。每个模块可以拥有(实际上确实拥有)自己的角色系统。 2. 稍后,应用程序应适应在不同机器上使用不同数据库。
我们认为Asp.NET MVC 3是完成这项任务的合适平台。为了管理应用程序数据,我们选择了最新版本的Entity Framework-其批处理数据提供程序和Code First功能可以节省我们大量时间。
我们纠结于用户/角色管理系统。我们应该有某种全局管理部分来添加用户并授予他们对模块的访问权限(只有全局管理员可以将用户添加到系统中,不支持“路人甲”注册),每个模块都有自己的管理部分,有自己的管理员和角色。我们已经有了存储所有必需内容的数据模型,但不知道如何从应用程序中正确地访问这些数据。
目前,我们看到解决此问题的两种可能方法:
1. 基于我们的DAL编写自定义Membership和Role提供程序。我们团队中没有人做过这件事,所以我们不确定这种方式是否值得麻烦。成员提供程序无法提供应用程序需要的灵活性,因此需要一些妥协。 2. 翻阅一些过时的书籍,找出在Membership提供程序创建之前如何组织网站管理系统。
这两种方式都不够优雅、不明显,并且选择哪种方式也不是一个容易的问题。此外,我们相信还可以有其他解决方案(当然,架构可能会受到影响)。因此,我们很乐意听取与此问题相关的任何建议。

2
实现自定义的成员资格和角色提供程序并不难(取决于您的要求),而且您将获得能够与这些接口一起使用的 ASP.NET 的所有好处。那么,为什么不停止试图重新发明轮子并开始旋转呢? - Emond
我们需要使用不同的数据库,并动态配置它们的表和关系 - 因此拥有我们自己的DAL并让所有用户在其中工作非常重要。标准会员提供程序及其数据库配置远非最佳决策,它无法为我们提供所需的功能。 - y.selivonchyk
Erno的意思是不要自己制定自定义角色解决方案 - 而是使用C# / Asp.Net中内置的内容。 - TheGeekYouNeed
@TheGeekYouNeed:这篇文章与我正在寻找的内容有关,您能否清楚地解释一下,如果我们使用内置于C#/Asp.net中的功能,如何从数据库中获取用户名和密码以验证用户填写的值?我希望您不介意解释一下。谢谢。 - Nothing
正如我们所发现的,在当前项目中拒绝使用本机角色/成员资格提供程序并不是什么大不了的事情。我们也没有编写自己的(我几乎无法想象为什么要这样做)。我们所需要做的就是:1)重写自己的LogOn方法。只需在那里将认证信息设置为用户cookie即可。2)在GlobalAjax.Application_AuthenticateRequest()事件中添加逻辑。在此事件中,我们将角色和一些附加信息分配给用户。为此,我们使用自己的IPrincipal实现,但是这部分可以跳过。如果有人需要详细说明,请告诉我。 - y.selivonchyk
4个回答

4
我个人建议首先使用标准会员提供程序来创建和验证用户,然后一旦您验证了用户不只是“街上的人”,请使用自己的自定义架构来验证已验证的用户是否可以访问他们正在尝试访问的控制器和操作。
内置会员提供程序处理了许多关于用户身份验证、密码存储等方面的细节。它使用最佳实践来避免暴力攻击、彩虹表攻击等。这是经过验证的。
但是,您的每个模块权限结构可能符合或不符合ASP.NET角色提供程序的模式。如果符合,那么很好,实现自定义角色提供程序是一个好主意。但是,如果您的需求“超出了常规”,您可能最好在最适合您的地方(控制器、操作、请求过滤器等)手动检查权限。

3

我建议您使用自定义成员资格提供程序。为什么?因为这是标准方式,可以节省大量工作。它并不像你想象的那么难,而且有很多资源,比如这个


3
写基于我们的数据访问层的自定义成员资格和角色提供程序。我们团队中没有人做过这个,所以我们不确定是否值得麻烦。成员提供程序不能提供应用程序需要的灵活性,因此需要进行一些调整。
如果默认提供程序无法提供所需功能,则编写自定义提供程序非常重要。如果您的数据库中已经有了复杂的用户系统,则自定义成员提供程序可能是个好主意。这将为您的团队增加宝贵的经验,并且您应该能够在下一个项目中重用大量代码。正如@Randolf提到的那样,有很多构建客户成员提供程序的好资源。从我的一些经验来看,实际上并不是很困难。所有的东西都在那里,您只需要实现一些方法。

1

好的,最終我們決定從頭開始編寫,這比看起來要容易。

  • 添加自己的IPrincipal實現。額外的字段和完全不同的邏輯用於IsInRole()方法,以避免編寫自己的屬性。
  • 在Global.ajax事件中將我們的IPrincipal分配給User。

這一點也不難。現在我們擁有了所有所需的靈活性。不涉及提供者。


嗨,尤金。我正在考虑这个同样的决定。我花了很多时间在自定义成员资格提供程序上,但它似乎比应该做的工作要多得多。你能否提供更多关于你所做的事情的信息来帮助我开始吗?这将不胜感激。 - Ozzy

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