帮助MVC身份验证/授权解决方案

时间:2011-03-07 21:57:02

标签: asp.net-mvc authentication asp.net-mvc-3

我正在构建一个MVC 3应用程序,需要找到一个管理身份验证和授权的好解决方案。我使用过Membership,在这种情况下我不想使用它 - 我更喜欢使用自己的设计和表格。但是,我愿意使用内置接口实现我的自定义逻辑,如果合适的话。

以下是我的要求:

  • 用户可以是一个或多个角色的一部分。

  • 角色可以映射到任意数量的“权限”(多对多)。许可类似于“可以编辑其他用户的帖子”。

  • 每个控制器操作可能允许访问一个或多个角色(或者对于公共页面可能不需要授权)。

  • 我还需要“功能级别”控制哪些角色可以查看/更新视图上的各种元素。可以使用权限来驱动这些与角色。

  • 作为附注,我可能还允许会员使用他们的Facebook和/或Twitter帐户进行注册。但这可以独立于我的自定义成员身份实现,如果这是合适的(即在注册时创建自定义用户,然后将其绑定到FB / Twitter帐户)。

我确定之前有人做过这样的事情。但基于我在这个主题上看到的十几个博客和SO帖子,没有一个解决方案真的适合这个,它似乎并不存在。但是我很有可能无法将各个部分组合在一起,而且适当的东西正在让我盯着我。

例如,我已经阅读了一些关于“基于声明”的身份验证与“基于角色”的身份验证,但不确定我是否了解足够的差异来进行呼叫,也不确定天气是否需要ASP.NET成员身份。我还读到了通过实现IPrincipal和IIdentity并使用动作过滤器来驱动控制器访问来构建自定义成员资格,但我没有找到任何全面的指南来执行此操作,而且我仍然相当绿色的动作过滤器。

我也不确定是否应该使用一些.NET的内置控件进行注册,身份验证,忘记密码等等。我的本能不是,因为我通常喜欢自己构建这些控件,而且我是也不确定它们是否可以在自定义设置中工作。但如果我错了,请告诉我。

提前致谢。

1 个答案:

答案 0 :(得分:4)

请记住,ASP.NET身份验证/授权框架有两个不同的部分。第一个是具有成员资格和角色提供者的前端,然后是使用SqlMembershipProviderSqlRoleProvider的后端。

根据我的个人经验,我发现编写自己的MembershipProvider和RoleProvider自定义版本最简单。我认为它将满足您的每一个要求。

更新:Jared问我:“似乎实现MembershipProvider和RoleProvider增加了很多我永远不需要/使用的开销(和绒毛)。这仍然是要走的路吗?我受益于这个吗?“

我认为如果你使用身份验证/授权框架,你可以利用许多内置的东西。例如,您可以根据[Authorize(Roles = "DefaultUser")]等角色为控制器设置方法授权。如果需要,您也可以直接在视图中放置这种检查代码,如:

<% if (Request.IsAuthenticated) { %> 
<p>Only authenticated users see this.</p>
<% } %>

此外,身份验证/授权负责设置角色/用户cookie和加密它们的繁琐工作。如果你自己动手,那么这就是你必须自己做的事情。

Jared还希望,“用户可以成为一个或多个角色的一部分。”并且“角色可以映射到任意数量的”权限“(多对多)。权限类似于”可以编辑其他用户的帖子“。

我认为角色和权限是一回事。因此,单个用户可以拥有多个角色和权限。像“CanEditPosts”,“Admin”等。