具有CRUD角色的ASP.NET MVC授权

时间:2013-08-19 11:09:24

标签: asp.net asp.net-mvc

我需要能够根据 CRUD 的动态角色限制用户在我的应用中可以执行的操作。

例如,用户/索引需要[ClaimsAuthorize("View", "User")]等身份验证[Authorise(Roles="Administrator")],以便我可以检查用户是否具有要查看的安全性。

我已配置用户角色,但用户可以使用的角色是动态角色。管理员可以使用复选框更改安全级别,这将使不同的安全组能够执行不同的操作。

主要问题是在 Razor 中执行此操作,我需要类似@User.CanEditUsers的内容,但我不知道如何才能完成此操作。

任何帮助都会非常感激,因为我无法找到正确的方法来解决这个问题。

3 个答案:

答案 0 :(得分:2)

您需要将角色的概念与设计中的组分开。

角色提供固定权限以在您的应用程序中执行某些操作。组是一组用户。管理员真正做的是将用户组分配给不同的角色。

您的授权码应该能够依赖固定的角色,例如: “ViewUserInfo”角色。然后实现管理界面,以便当admin允许用户查看userinfo时,将该用户添加到“ViewUserInfo”角色。

组也是如此:如果授予整个用户组查看用户信息的权限,则应将该组添加到“ViewUserInfo”角色。要介绍组的概念并能够将组添加到角色,您不能依赖标准的SimpleRoleProvider,因此您可能必须实现自己的角色提供程序以及组提供程序。

最后,一些解决方法可能会更容易,但在我看来,这是一个更清洁的架构。

答案 1 :(得分:2)

请注意,授权用户查看特定页面元素与授权CRUD或其他数据库操作不同,除非元素指向Controller中的操作操作。考虑到您可能有一些元素,不需要特定用户查看,也没有特定的数据库操作。到目前为止,我们得出结论,我们需要以下权限:

  1. 查看许可
  2. 命令许可
  3. 我相信你可以对这两个部分使用Microsoft Role Provider。根据MSDN文档考虑到:

      

    Authorize属性允许您指明授权   限制为预定义角色或个人用户。这给了你   高度控制谁有权查看任何页面   该网站。

    在下一步/问题是如何做到这一点?

    我认为有三种方法可以满足我们的目的:

    • 解决方案1:由于将每个用户转发到相关的视图,因此使用特定的页面元素创建单独的视图。在这种情况下,我们必须 也创建单独的控制器动作。我们必须检查用户类型 在每个动作之前,如[Authorise(Roles="Administrator")]。我们 被迫拥有静态(预定义)角色和可访问性。并在 一句话由于冗余而不是一个好的解决方案 不稳定性

    • 解决方案2 :动态创建页面只需为一页中的每个访问限制元素添加一些if条件(适用于 示例编辑页面)。这就像使用@if (User.IsInRole("Admin"))授权特定用户并进行展示一样 相关的页面元素,如按钮。在Controller方面我们可以使用 由于添加动态,if条件(而不是FilterAttribute 基于生成/添加的新角色的功能)和控制有效 对数据库的事务。虽然FilterAttribute添加了一些伟大的功能主义者(如性能优化)。用一句话一个温和的解决方案

    • 解决方案3:像解决方案2一样,只需修复控制器问题 创建我们自己的自定义FilterAttribute以进行授权。那会的 继承自AuthorizeAttribute并覆盖OnAuthorize 您需要的方法仅适用于操作

    例如:

    public class TableAuthorizeAttribute : AuthorizeAttribute
    {
        public enum TableAction
        {
            Read,
            Create,
            Update,
            Delete
        }
        public TableAction Action { get; set; }
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            //do custom authorizization using Action and getting TableEntryID 
            //from filterContext.HttpContext.Request.QueryString or
            //filterContext.HttpContext.Request.Form
        }
    }
    

    它的用法如下:

    [TableAuthorize(Action=TableAuthorizeAttribute.TableAction.Update)]
    

    Here是关于上述概念的完整示例。以下是创建动态AuthorizeAttribute的完整示例,用于授权添加到应用程序的新角色。

    解决方案3用一句话完美而复杂的解决方案

    请注意,在操作之前使用FilterAttribute我们将应用程序限制为静态/预定义角色。无需使用其他数据结构或在数据库中生成表。

答案 2 :(得分:1)

从马的口中说:“角色管理可以帮助您管理授权,这使您可以指定允许应用程序中的用户访问的资源。角色管理允许您将用户组作为一个单元处理,方法是将用户分配给角色,例如作为经理,销售人员,会员等。“ (参考:http://msdn.microsoft.com/en-us/library/5k850zwb%28v=vs.100%29.aspx

用户可以担任多个角色,您可以利用操作过滤器对您网站中各种资源的访问进行细粒度控制:

 [Authorize(Roles="Contributor, Designer, Reviewer")]

我认为您所面临的“动态”方面围绕着管理员能够按需添加和删除用户,这些角色提供对这些资源的访问权限,这是非常典型的。

不断更改角色授予的权限的想法将是一个糟糕的设计选择。