基于DB的MVC页面级安全性除角色外

时间:2013-05-16 13:43:05

标签: security asp.net-mvc-4

我正在使用[Authorize(Roles =“Administrator”)]等来控制对页面的访问,但除此之外,我的客户还想要更多。我们有用户可以创建SubUsers并确定他们可以访问哪些屏幕。例如,用户1可能指示SubUser 1可能获得屏幕1-4而不是5-8(这里为了简单起见使用数字)。 SubUser 2可能会获得奇数屏幕,SubUser会获得偶数屏幕。

这似乎不像基于角色的安全性。我打算为用户创建一个选择SubUser的屏幕,然后进入另一个屏幕,每个屏幕都有复选框,并检查SubUser可以访问的屏幕。很容易。

我的问题是,如何在应用中强制执行?显而易见的方法是,在每次获取时,点击数据库,传入该用户名和该屏幕的ID,看看他们是否有权访问。有没有更好的方法,以避免在每个页面上点击数据库进行检查?由于没有会话对象,我无法获取他们可以访问的页面ID的数组(仅一次)并将其存储在会话中。

1 个答案:

答案 0 :(得分:0)

     public class ServiceCheckAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                // check user role
                // Check if user has access to this action/page
                if (userHasAccess)
                {
                    base.OnActionExecuting(filterContext);
                }
                else
                {
                    filterContext.Result = new RedirectToRouteResult(new
                    RouteValueDictionary(new { controller = "Error", action = "AccessDenied" }));
                }
            }
        }

在每个需要检查用户可访问性的控制器上添加此属性[ServiceCheckAttribute]