现在的位置: 主页 > 在线留言 > 文章列表

ASP.net MVC 基于角色的权限控制系统的实现

作者:成都金海力科技有限公司 来源:www.scjinhaili.com 未知发布时间:2017-09-08 17:59:46
ASP.net MVC 基于角色的权限控制系统的实现 、引言

我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法。

下面是最常见的实现方式:

复制代码

public class CustomAuthorizeAttribute : AuthorizeAttribute

{

public override void OnAuthorization(AuthorizationContext filterContext)

{

if (!filterContext.RequestContext.HttpContext.Request.IsAuthenticated)

{

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "account", action = "login", returnUrl = filterContext.HttpContext.Request.Url, returnMessage = "您无权查看." }));

return;

}

base.OnAuthorization(filterContext);

}

}

复制代码

然后在需要验证的Action上打上[CustomAuthorize]标签就可以了。

这种方式是比较粗粒度的解决方案,由于是已经将定义好(约定好的)权限hard code带对应的Action上,所以无法实现用户自定义权限控制。

看一下代码:

复制代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;

namespace Deepleo.Role.Controllers

{

public class UserController : Controller

{

[UserAuthorize]

public ActionResult Index()

{

return View();

}

[AdminAuthorize]

public ActionResult Admin()

{

return View();

}

[UserAuthorize]

public ActionResult Detail()

{

return View();

}

}

}

复制代码

我们有一个UserController,他有3个Action:Index,Admin,Detail.其中Admin需要系统管理员权限,其他两个值需要User权限。这样就需要建立AdminAuthorizeAttribute和UserAuthorizeAttribute.这样做就无法实现用户自定义权限。

二、基于角色的权限控制系统

基于角色的权限控制系统RBAC(Role Based Access Control)是目前最流行,也是最通用的权限控制系统。

对于ASP.NET MVC来说,这套系统很容易实现:Controller下的每一个Action可以看作是一个权限,可视化专题,角色就相当于多个权限的组合。

然后我们新建一个RoleAuthorizeAttribute,即对角色的属性描述。

2.1 如何鉴权

这个RoleAuthorizeAttribute的关键在于如何拿到ControllerName和ActionName,查阅msdn其实很容易就实现了,不多说,直接上代码:

复制代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Security;

using System.Web.Mvc;

using System.Web.Routing;

using Deepleo.Role.Services;

namespace Deepleo.Role.Attributes

{

public class RoleAuthorizeAttribute : AuthorizeAttribute

{

public override void OnAuthorization(AuthorizationContext filterContext)

{

var isAuth = false;

if (!filterContext.RequestContext.HttpContext.Request.IsAuthenticated)

{

isAuth = false;

}

else

{

if (filterContext.RequestContext.HttpContext.User.Identity != null)

{

var roleService = new RoleService();

var actionDescriptor = filterContext.ActionDescriptor;

var controllerDescriptor = actionDescriptor.ControllerDescriptor;

var controller = controllerDescriptor.ControllerName;

var action = actionDescriptor.ActionName;

var ticket = (filterContext.RequestContext.HttpContext.User.Identity as FormsIdentity).Ticket;

var role = roleService.GetById(ticket.Version);

if (role != null)

{

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:十堰SEO http://shiyan.raoyu.net

上一篇:HDU - 2883 kebab (最大流) 下一篇:最后一页