C# 用户和角色管理MVC4

C# 用户和角色管理MVC4,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我正在用MVC4编写一个定制的web系统,该系统的一部分要求管理员用户管理公司中的角色和用户,以提供对系统某些区域的访问和权限。系统中有以下模块: 销售 生产 管理团队希望能够在系统中创建角色并对这些角色应用权限。例如,销售角色将被拒绝访问生产,但销售经理可以对生产进行只读访问 我正在寻找一个最好的方法来管理一个单一的管理屏幕这个例子。管理员需要 创建角色 创建用户 分配角色 为系统中的模块和操作分配角色权限 另外,当角色需要动态分配时,我将如何在控制器级别实现它 [Authorize(Ro

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

销售 生产

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

我正在寻找一个最好的方法来管理一个单一的管理屏幕这个例子。管理员需要

  • 创建角色
  • 创建用户
  • 分配角色
  • 为系统中的模块和操作分配角色权限
另外,当角色需要动态分配时,我将如何在控制器级别实现它

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

    return View();

}
如有任何意见,将不胜感激


谢谢

您需要像这样创建自定义的
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();
}

实现这一点的一种方法是使用具有两级角色的数据模型:

  • 集团角色(如销售人员)。用户是组角色的成员,即存在M-N关系Users-GroupRoles

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

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

您还可以自定义“展平”此模型,即
GetRolesForUser
方法返回用户的所有PermissionRoles(通过其GroupRole成员身份)

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

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

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

Thread.CurrentPrincipal.IsInRole("SomeAction") // in code