MVC3中的角色管理

本文关键字:管理 角色 MVC3 | 更新日期: 2023-09-27 17:58:29

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

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

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

请给我一些改进的建议。

提前谢谢。

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属性装饰所有操作/控制器,并指定可用的操作/控制器的角色:[Authorize("Customer, Manager, RegionalAdmin")],并提供管理员为用户分配角色的可能性。但请记住,在中只需在列出的角色中的一个角色中即可获得访问权限,您不能通过此属性要求,例如Admin和Manager角色。如果您需要一个以上的角色,请使用多个属性:

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

2.对于您的页面,您可以创建自己的过滤器属性,继承自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.装饰操作(控制器),管理员授予用户访问权限:

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

}

我不建议使用基本控制器来实现这一目标,因为属性使用更灵活(您可以在操作/控制器级别上进行控制,而不仅仅是控制器级别),这是实现独立责任的更好方式。基本控制器和过滤器属性的使用作为多态性和开关运算符相关。

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

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,这种体系结构很容易被项目的未来开发人员错过。

阅读简单的旧表单身份验证,以添加对角色和用户管理的支持。

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

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

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