【问题标题】:Permission-based authorization in ASP.NET MVC3ASP.NET MVC3 中基于权限的授权
【发布时间】:2012-05-07 16:14:47
【问题描述】:

我正在将 ASP.NET MVC 添加到现有的 WebForms 应用程序中。暂时我不关心身份验证/登录,因为这部分由现有代码处理(表单身份验证)。

在现有的 WebForms 应用程序中,我们对每个页面都有一个完全自定义的基于权限的授权。所以每个用户都有一组权限,列出了他可以访问的页面。
现在我需要决定如何使用相同的权限系统来限制对特定 MVC 控制器和操作的访问。

据我了解,对于 ASP.NET MVC,有一个标准 AuthorizeAttribute 我可以在其中指定角色。我还发现了一些建议指定权限而不是角色的文章 - 然后可以执行以下操作:

[CustomAuthorize(Roles = "View products, Edit products")]

通过扩展 AuthorizeAttribute,我还可以定义我如何存储和访问权限。

这个解决方案对我来说是可以接受的(虽然改变角色的语义有点味道)。
但在承诺之前,我想看看还有哪些其他选择。这就是我卡住的地方——我还没有找到关于 ASP.NET MVC 中授权的不同方法的完整概述。我还想知道所有安全概念(如表单身份验证、成员资格提供程序、授权属性、IPrincipal 等)是如何相互关联的,以及它们应该如何协同工作。

【问题讨论】:

  • 这是否与此处尝试的相似:stackoverflow.com/questions/10338734/…
  • @antijon 据我了解,它类似于实现自定义 AuthorizeAttribute。但我想更详细地了解其他选项及其优缺点。

标签: .net asp.net-mvc asp.net-mvc-3 asp.net-membership authorization


【解决方案1】:

首先要了解的是,就像 Webforms 一样,MVC 中也有一个管道。每个请求都会经过许多方法,并且沿途有一些扩展点,您可以“挂钩”并执行操作。

AuthorizeAttribute 所做的只是挂钩到 OnAuthorization 扩展点,并根据您提供给它的标准(用户名、角色等)决定是否授予某人访问权限。

这是一个例子:http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

您可以创建自己的自定义授权属性,并使用您自己的标准执行完全相同的操作。您无需重新调整 Roles 参数的用途,您可以根据需要自行创建。

这是 MVC 更喜欢的方法。另一件好事是,如果您也将其设置为过滤器,则可以将其添加到全局过滤器中,并根据需要将其应用于所有内容。

你基本上还有另外两个合理的选择。在 Application_AuthenticateRequest 的 global.asax 中实现一个处理程序(不推荐)或创建一个通用的 BaseController 来覆盖 OnAuthorize(属性挂钩相同的东西,但在不同的位置)。

很多人尝试使用 Session 变量进行身份验证,这是最糟糕的做法。

由于我们对您的身份验证和权限系统一无所知,我们所能做的就是提供一般性建议。

【讨论】:

  • 感谢您的回答!关于身份验证——它只是通过 Forms Auth 和使用自定义 User 类的用户名/密码登录。关于权限系统——我们为每个页面定义了一个“模块密钥”,并且我们将每个用户访问每个页面的权限存储在数据库中。检查权限目前在BasePage : Page 中实施。我不确定这是否是您想知道的信息?
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2013-10-21
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多