我正在MVC4中编写一个定制的Web系统,该系统的一部分需要Admin用户来管理公司中的角色和用户,以便为系统的某些区域提供访问权限。系统中有系统模块:
销售 生产
管理团队希望能够在系统中创建角色并将权限应用于这些角色。例如。销售角色将被拒绝访问生产,但销售经理可以只具有生产权限。
我正在寻找一个管理此屏幕的最佳方法示例。管理员需要
另外,我如何在Controller级别实现它,因为角色需要动态分配?
[Authorize(Roles="Sales")] // needs to be dynamic
public ActionResult SalesIndex(){
return View();
}
任何想法都将不胜感激
由于
答案 0 :(得分: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();
}
答案 1 :(得分:0)
实现此目的的一种方法是拥有一个具有两个角色级别的数据模型:
GroupRoles(例如Sales)。用户是组角色的成员,即存在M-N关系Users-GroupRoles。
PermissionRoles。表示由应用程序控制的资源或操作或资源的细粒度权限。 GroupRoles和PermissionRoles之间存在M-N关系。
然后,您将拥有一个自定义管理UI,将用户分配给GroupRoles和GroupRoles到PermissionRoles。
您还可以使用自定义RoleProvider“展平”此模型,即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