2

我正在用 MVC4 编写一个定制的 Web 系统,该系统的一部分需要管理员用户来管理公司中的角色和用户,以提供对系统某些区域的访问和权限。该系统在系统中有模块:

销售生产

管理团队希望能够在系统中创建角色并将权限应用于这些角色。例如,销售角色将被拒绝访问生产,但销售经理可以只读访问生产。

我正在寻找一个管理单个管理屏幕的最佳方法的示例。管理员需要

  • 创建角色
  • 创建用户
  • 分配角色
  • 为系统中的模块和操作分配角色权限

另外,由于需要动态分配角色,我将如何在控制器级别实现它?

[Authorize(Roles="Sales")] // needs to be dynamic
public ActionResult SalesIndex(){

    return View();

}

任何想法,将不胜感激

谢谢

4

2 回答 2

3

您需要AuthorizeAttribute像这样创建自定义

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var userIdentity = httpContext.User.Identity;

        if (!userIdentity.IsAuthenticated)
            return false;

        var rd = httpContext.Request.RequestContext.RouteData;
        string currentAction = rd.GetRequiredString("action");
        if(currentAction == "SalesIndex") 
        {
            return IsUserIsInRoleForTheView(userIdentity.Name);    
        }

        return true;
    }
}

[CustomAuthorize] 
public ActionResult SalesIndex()
{
    return View();
}
于 2013-03-11T13:38:58.883 回答
0

一种方法是建立一个具有两个角色级别的数据模型:

  • GroupRoles(例如销售)。用户是组角色的成员,即存在MN 关系Users - GroupRoles。

  • 权限角色。表示由应用程序控制的资源或操作或资源的细粒度权限。GroupRoles 和 PermissionRoles 之间存在 MN 关系。

然后,您将拥有一个自定义管理 UI,将用户分配给 GroupRoles,将 GroupRoles 分配给 PermissionRoles。

您还将有一个自定义RoleProvider来“扁平化”此模型,即该GetRolesForUser方法返回用户的所有 PermissionRoles(通过他的 GroupRole 成员资格)。

然后,您可以使用标准 .NET API 进行授权,并且不需要自定义 Authorize 属性:

[Authorize(Roles="SomeAction")] // for an MVC Controller

[PrincipalPermission(SecurityAction.Demand, Role = "SomeAction")] // For a method in the BLL

Thread.CurrentPrincipal.IsInRole("SomeAction") // in code
于 2013-09-29T17:42:09.840 回答