.net - ASP.NET MVC3 中基于权限的授权

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

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

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

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

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

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

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

最佳答案

您首先要了解的是,与 Webforms 非常相似,MVC 中有一个管道。每个请求都经过许多方法,并且沿途有一些扩展点,您可以“ Hook ”并执行操作。

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 (属性 Hook 相同的东西,但在不同的地方)。

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

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

关于.net - ASP.NET MVC3 中基于权限的授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341741/

相关文章:

c# - 带 IoC 的工厂隔离模式

c# - 当 AggregateException.InnerExceptions.Count > 1 时,有人遇到过这种情况吗?

.net - 使用 NGEN 更新 RemoteAPP 应用程序的正确方法

c# - 递归局部 View

asp.net-mvc - 有什么方法可以避免 iisexpress 每次构建时加载 DLL 时的启动延迟?

visual-studio-2010 - 默认浏览器 - Visual Web Developer Express 2010

.net - 如何正确处理频繁变化的.Net windows服务

c# - 将 [Authorize] 属性与用户的电子邮件一起使用

asp.net-mvc - 操作过滤器中存储的实例状态不正确

c# - 如何从 View asp.net-mvc-3 返回数组