ASP.NET自定义角色提供程序:角色取决于上下文?

时间:2012-01-18 14:12:37

标签: asp.net asp.net-mvc authorization membership-provider roleprovider

我正在开始一个新项目,我对ASP.Net MVC 3的自定义角色提供程序提出了一个问题。

我需要对我的构造函数的几个操作进行角色验证,所以我说过,好的,我可以使用角色提供程序。

问题在于角色取决于当前的“上下文”:

实际上,我的数据库中的用户链接到多个“实体”,实体X的角色为“A”,实体Y的角色为B.所有将显示/编辑的数据都是“儿童”这个实体

严格分开:当我们登录时,我们必须选择我们想要工作的实体,然后,在我们要求更改实体之前,我们将只拥有该实体的数据和该实体的权利。

当前的“实体”将存储在会话中。

目标是对实体X没有未经授权的菜单/操作,只是因为用户Y允许这样做。

问题是在角色提供者中,我无法接收任何上下文,我只收到用户名。

那么您认为我能做些什么?(如果它可以提供帮助,会员资格也是一个自定义会员提供商。)

1 个答案:

答案 0 :(得分:0)

要阻止对这些特定页面的访问,您可以对操作实施RoleManagementFilter。这将只允许用户担任员工角色,管理员角色访问特定页面。

[RequiresEmployeeRole(Route = "Account", Action = "LogOn", Order = 1)]
Public ActionResult EmployeeSettings(){
    return View();
}

ActionFilter所做的是基于请求页面的用户的角色将其重定向到路由和您设置Route =“Account”,Action =“LogOn”或允许他们进入的操作。

以下是ActionFilterAttribute的一部分。

public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string[] roles = Roles.GetRolesForUser();
        string userrole = "";

        if (roles.Length > 0)
            userrole = roles[0];

        if (Regex.IsMatch(userrole, Role))
            filterContext.HttpContext.Response.Redirect(redirectUrl(), true);
    }

我不知道您拥有的实体有多少,如果它是可行的,但是如果您要为每个实体创建角色,请将用户附加到这些角色,然后您可以根据操作建立操作限制在Roles.GetRolesForUser();

我找到了可能有用的MSDN文章重新操作过滤器http://msdn.microsoft.com/en-us/magazine/gg232768.aspx。有很多例子可以帮助你。