2011-06-07 83 views
11

我想为应用程序添加一项功能,以便只有管理员可以创建用户,并且他可以为用户提供对特定页面的访问权限。MVC3中的角色管理

他可以创建角色并可以为用户提供不同的角色。

我正在使用Visual Studio 2010并在MVC3中构建此应用程序。

请给我建议,以弥补它。

在此先感谢。

回答

4

你在问一个非常宽泛的问题,需要一些时间来检查你的所有需求。在任何情况下,您都可以通过将用户属性添加到所有其他控制器从其继承的控制器开始。然后,您可以询问该用户实例以确定他们是否有权访问当前路由。此解决方案应为您提供基础,以便为业务需求添加一些管理视图。

public class MegaController 
{ 
    protected User CurrentUser { get; set; } 

    protected override void Initialize(RequestContext context) 
    { 
     if (requestContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      var userRepository = new UserRepository(); 
      CurrentUser = userRepository.GetUser(
       requestContext.HttpContext.User.Identity.Name); 
     } 
    } 
} 

UserUserRepository类型可以是你自己设计的。您可以使用LINQ To Entities来包装名为“User”的表,然后在您的控制器中,您可以访问该表中的任何字段。

然后,从MegaController

public class AdminController : MegaController 
{ 
    public ActionResult Action1() 
    { 
     return View(); 
    } 
} 

public class SomeOtherController : MegaController 
{ 
    public ActionResult Action1() 
    { 
     return View(); 
    } 
} 

继承所有控制器现在,这并不能完全解决你的 “管理员” 的问题。为此,您可以在MegaController.Initialize()中包含逻辑来询问请求信息。一旦你在上下文中所要求的路线和用户,您的代码可以做出决定是否允许该请求,并将其重定向到,等使用这种方法

protected override void Initialize(RequestContext context) 
{ 
    // ... 
    if(context.HttpContext != null) 
    { 
     if(context.HttpContext.Request.Path == "some/restricted/route" 
      && CurrentUser.Role != "Admin") 
     { 
      // or similar error page 
      var url = Url.Action("UnAuthorized", "Error"); 
      context.HttpContext.Response.Redirect(url); 
     } 
    } 
} 

一个需要注意的是,任何新的控制器添加到您的应用程序必须继承MegaController,这个架构可能很容易被项目的未来开发人员忽略。

+0

是否有任何教程可以指导我这个。 – kapil 2011-06-07 17:47:17

+0

@kapil我无法在没有附加要求的情况下尝试推荐任何文档。你能否在你原来的文章中详细说明? – 2011-06-07 18:02:19

13

1.Decorate用户创建和使用授权许可设定动作属性 (通知,AuthorizeAttribute的角色属性是使用需要实现的MembershipProvider(非标准或自定义),并在web.config中对其进行注册)

public class AccountController : Controller 
{ 
[HttpGet, Authorize(Roles = "Admin")] 
public ViewResult CreateUser() 
{ 
    return View(); 
} 

[HttpPost, Authorize(Roles = "Admin")] 
public ActionResult CreateUser() 
{ 
    //... call service method to create user 
} 

[HttpPost, Authorize(Roles = "Admin")] 
public ActionResult AssignPageToUser(int userId, string controllerName, string ActionName) 
{ 
    //... insert record into table (UserPermissions) with attributes (userId, actionName, controllerName) 
    } 
// other methods without decoration by authorize attribute 
} 

如果您真的想完全控制每个用户的操作权限,那么下一段是正确的。 如果您认为您的权限可以在角色中以有限数量和小数量分组 - 您可以通过授权属性来修饰所有操作/控制器,并指定可用的操作/控制器角色:[Authorize("Customer, Manager, RegionalAdmin")]并赋予管理员将角色分配给用户的可能性。但请记住,只有1个列出的角色才能获得访问权限,因此无法通过此属性(例如Admin和Manager角色)进行请求。 如果你想一定需要1个多角色,使用多个属性:

public class MyController:Controller 
{ 
[Authorize(Roles = "Manager")] 
[Authorize(Roles = "Admin")] 
public ActionResult Action1() 
{ 
//... 
} 
} 

2.对于你的网页,你可以创建自己的筛选器属性,从授权属性继承,将检查,如果动作是可用户(我认为你想分配行动,但不是意见给用户)。

public UserPermissionRequiredAttribute: AuthorizeAttribute 
{ 
public OnAuthorization(AuthorizationContext filterContext) 
{ 
var isAuthenticated = filterContext.HttpContext.User.Identity.IsAuthenticated; 
var userName = filterContext.HttpContext.User.Identity.Name; 
var actionName = filterContext.ActionDescriptior.ActionName; 
var controllerName = filterContext.ActionDescriptior.ControllerDescriptor.ControllerName; 
    if (isAuthenticated && myUserActionPermissionsService.UserCanAccessAction(userName, actionName, contollerName) 
{ 
filterContext.Result = HttpUnauthorizedResult(); // aborts action executing 
} 
} 
} 

3.Decorate动作(控制器),由管理员向用户授予的是访问:

MySpecialController: Controller 
{ 
[UserPermissionRequired] 
Action1() 
{ 
//... 
} 

[UserPermissionRequired] 
Action2() 
{ 
//... 
} 

Action3() 
{ 
//... 
} 

}

我不建议使用基本控制器为目标,因为属性使用更灵活(您可以控制动作/控制器级别而不是控制器级别),这是实施分离责任的更好方法。基本控制器和过滤器属性的使用与多态性和开关操作符相关。

2

阅读关于普通老表单认证添加对角色和用户管理的支持。

然后在控制器或操作上使用[Authorize(Roles="RoleName1")]来控制访问。

1

检查MvcMembership,也可在Nuget上获得。您将拥有ASP.NET MVC 3站点中用户管理的所有基础知识。

您将需要一个用户/角色提供者。阅读this tutorial以了解如何设置可容纳用户和角色的数据库。一旦安装完成,您将拥有创建首次安装/手动测试所需的所有存储过程。