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); } } }
User
和UserRepository
类型可以是您自己的设计。 您可以使用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站点中用户管理的所有基础知识。
您将需要一个用户/角色提供程序。 阅读本教程 ,了解如何设置可容纳您的用户和角色的数据库。 设置完成后,您将拥有创建首次设置/手动测试所需的所有存储过程。
上述就是C#学习教程:MVC3中的角色管理分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/985712.html