我正在使用[Authorize(Roles =“Administrator”)]等来控制对页面的访问,但除此之外,我的客户还想要更多。我们有用户可以创建SubUsers并确定他们可以访问哪些屏幕。例如,用户1可能指示SubUser 1可能获得屏幕1-4而不是5-8(这里为了简单起见使用数字)。 SubUser 2可能会获得奇数屏幕,SubUser会获得偶数屏幕。
这似乎不像基于角色的安全性。我打算为用户创建一个选择SubUser的屏幕,然后进入另一个屏幕,每个屏幕都有复选框,并检查SubUser可以访问的屏幕。很容易。
我的问题是,如何在应用中强制执行?显而易见的方法是,在每次获取时,点击数据库,传入该用户名和该屏幕的ID,看看他们是否有权访问。有没有更好的方法,以避免在每个页面上点击数据库进行检查?由于没有会话对象,我无法获取他们可以访问的页面ID的数组(仅一次)并将其存储在会话中。
答案 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]