MVC3中的角色管理

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

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

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

请给我建议。

提前致谢。

1.使用Authorize属性(通知,使用AuthorizeAttribute的Roles属性需要实现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")]并赋予管理员为用户分配角色的可能性。 但请记住,只有在列出的角色中只有一个才能获得访问权限,您不能要求此属性,例如Admin和Manager角色。 如果您想要需要多于1个角色,请使用多个属性:

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

2.对于您的页面,您可以创建自己的filter属性,inheritance自authorize属性,该属性将检查操作是否可供用户使用(我认为您要为用户分配操作而不是视图)。

 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.Decrate动作(控制器),管理员授予的用户可访问:

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

}

我不建议为此目的使用基本控制器,因为属性使用更灵活(您可以控制操作/控制器级别而不是仅控制器级别),这是实现分离责任的更好方法。 基本控制器和filter属性用法作为多态和switch运算符相关联。

您提出了一个非常广泛的问题,需要一些时间来审核您的所有要求。 在任何情况下,您都可以首先将用户属性添加到控制器,所有其他控制器都从该控制器inheritance。 然后,您可以询问该用户实例以确定他们是否可以访问当前路由。 此解决方案应为您提供为业务需求添加一些管理视图所需的基础。

 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); } } } 

使用此方法的一个警告是,添加到应用程序的任何新控制器都必须inheritanceMegaController ,这是一个很容易被项目未来开发人员忽略的架构。

了解普通旧表单身份validation,以添加对角色和用户管理的支持。

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

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

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