`
coconut_zhang
  • 浏览: 541688 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

MVC 自定义AuthorizeAttribute实现权限管理

 
阅读更多

在上一节中提到可以使用AuthorizeAttribute进行权限管理:

复制代码
        [Authorize]
        public ActionResult TestAuthorize()
        { 
            return View();
        }

        [Authorize(Users="test1,test2")]
        public ActionResult TestAuthorize()
        { 
            return View();
        }

        [Authorize(Roles="Admin")]
        public ActionResult TestAuthorize()
        { 
            return View();
        }
复制代码

但是通常情况下,网站的权限并不是固定不变的,当新增角色或者角色改变时,只能修改每个Action对应的特性,当项目较大时工作量可想而知。幸运的是我们可以重写AuthorizeAttribute达到自定义的权限管理。新建一个CustomAuthorizeAttribute类,使这个类继承于AuthorizeAttribute。打开AuthorizeAttribute查看下方法说明,我们只需要重写AuthorizeCore和OnAuthorization就能达到我们的目的。

 

复制代码
// Summary:
        //     When overridden, provides an entry point for custom authorization checks.
        //
        // Parameters:
        //   httpContext:
        //     The HTTP context, which encapsulates all HTTP-specific information about
        //     an individual HTTP request.
        //
        // Returns:
        //     true if the user is authorized; otherwise, false.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The httpContext parameter is null.
        protected virtual bool AuthorizeCore(HttpContextBase httpContext);


//
        // Summary:
        //     Called when a process requests authorization.
        //
        // Parameters:
        //   filterContext:
        //     The filter context, which encapsulates information for using System.Web.Mvc.AuthorizeAttribute.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The filterContext parameter is null.
        public virtual void OnAuthorization(AuthorizationContext filterContext);
复制代码

 

 

CustomAuthorizeAttribute重载AuthorizeCore方法,它的处理逻辑如下:首先判断当前账户是否被认证,如果没有,则返回false;然后获取当前账户的类型,并跟给定的类型进行比较,如果类型相同,则返回true,否则返回false。一般网站中权限管理都会使用权限树,然后将角色的权限保存至数据库或者文件中,本例中我们使用XML文件保存每个Action的角色,这样在用户请求Action时,由XML文件获取Action对应的权限,然后检测账户是否有相应的权限。CustomAuthorizeAttribute类的代码如下:

 

复制代码
public class CustomAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
    {
        public new string[] Roles { get; set; }
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext == null) {
                throw new ArgumentNullException("HttpContext");
            }
            if (!httpContext.User.Identity.IsAuthenticated) {
                return false;
            }
            if (Roles == null) {
                return true;
            }
            if (Roles.Length == 0)
            {
                return true;
            }
            if (Roles.Any(httpContext.User.IsInRole))
            {
                return true;
            }
            return false;
        }

        public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
        {
            string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            string actionName = filterContext.ActionDescriptor.ActionName;
            string roles = GetRoles.GetActionRoles(actionName, controllerName);
            if (!string.IsNullOrWhiteSpace(roles)) {
                this.Roles = roles.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
            }
            base.OnAuthorization(filterContext);
        }
    }
复制代码

 

当用户请求一个Action时,会调用OnAuthorization方法,该方法中GetRoles.GetActionRoles(actionName, controllerName);根据Controller和Action去查找当前Action需要具有的角色类型,获得Action的Roles以后,在AuthorizeCore中与用户的角色进行比对Roles.Any(httpContext.User.IsInRole),如果没有相应权限则返回false,程序就会自动跳转到登录页面

 

GetRoles为XML解析类,代码如下:


复制代码
   public class GetRoles
    {
       
        public static string GetActionRoles(string action, string controller) {
            XElement rootElement = XElement.Load(HttpContext.Current.Server.MapPath("/")+"ActionRoles.xml");
            XElement controllerElement = findElementByAttribute(rootElement, "Controller", controller);
            if (controllerElement != null)
            {
                XElement actionElement = findElementByAttribute(controllerElement, "Action", action);
                if (actionElement != null)
                {
                    return actionElement.Value;
                }
            }
            return "";
        }

        public static XElement findElementByAttribute(XElement xElement,string tagName, string attribute)
        {
            return xElement.Elements(tagName).FirstOrDefault(x => x.Attribute("name").Value.Equals(attribute,StringComparison.OrdinalIgnoreCase));
        }
    }
复制代码

 

相应的权限XMl文件:

 

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<Roles>
    <Controller name="Home">
        <Action name="Index"></Action>
        <Action name="About">Manager,Admin</Action>
        <Action name="Contact">Admin</Action>
    </Controller>
</Roles>
复制代码

 

当需求发生变化时,只需要修改XML文件即可

使用时,只需要在FilterConfig中注册该filter

filters.Add(new CustomAuthorizeAttribute());

 

当然这只是一个简单的例子,实际应用中会复杂许多,还可能要实现在即的MemberShipProvider和RoleProvider

分享到:
评论

相关推荐

    MVC权限控制小例子(重写AuthorizeAttribute)

    在这个"MVC权限控制小例子"中,我们将探讨如何利用授权特性(AuthorizeAttribute)来实现精细的权限管理。 AuthorizeAttribute是ASP.NET MVC框架中的一个内置特性,用于控制用户访问控制器和操作方法的权限。默认...

    MVC自定义权限控制示例代码

    标题提到的"MVC自定义权限控制示例代码"是一个很好的起点,它展示了如何通过继承`AuthorizeAttribute`来扩展MVC的安全功能。这个小样例可以帮助开发者更好地理解和实现基于角色或特定条件的访问控制。 首先,`...

    MVC 自定义属性 demo

    在.NET MVC框架中,自定义属性(Attributes)是一种强大的工具,允许开发者扩展和定制应用程序...通过研究这个示例,开发者可以学习如何创建自己的MVC自定义属性,以满足特定的业务需求,提升代码的复用性和可维护性。

    C# MVC 权限管理源码

    在基于ASP.NET MVC框架的开发中,这种权限管理系统可以帮助开发者实现对用户访问控制的精细化管理。 在MVC(Model-View-Controller)架构模式下,C#扮演着编程语言的角色,提供了丰富的类库和工具支持,使得开发者...

    asp.net core项目mvc权限控制:分配权限

    在本教程中,我们将探讨如何在ASP.NET Core MVC项目中实现这一功能,特别是如何进行权限的分配。 首先,权限控制通常涉及三个核心实体:用户、角色和权限。用户是系统中的个体,角色是一组权限的集合,而权限则定义...

    AuthorizeAttribute.rar

    在ASP.NET MVC5框架中,`AuthorizeAttribute`是一个至关重要的组件,它用于实现基于角色的安全性和访问控制。这个压缩包文件“AuthorizeAttribute.rar”显然包含了关于如何使用此特性来验证用户登录状态并处理未登录...

    asp.MVC OA系统权限管理视频加代码

    在ASP.NET MVC框架中,权限管理可以通过多种方式实现,例如使用角色基础的安全性(Role-Based Security)、授权过滤器(Authorization Filters)或者更复杂的自定义权限解决方案。 1. 角色基础的安全性:这是ASP...

    MVC4实现角色权限验证的例子

    在本文中,我们将深入探讨如何在ASP.NET MVC4框架中实现角色权限验证,这是一个非常重要的概念,对于构建安全、有管理的Web应用程序至关重要。MVC4是Microsoft开发的一个用于构建动态网站的开源Web应用程序框架,它...

    mvc权限控制案例

    在实现权限控制时,自定义的`AuthorizeAttribute`是关键。这允许我们在控制器或操作级别设置访问规则,只有符合指定条件的用户才能访问。ActionFilter是MVC中的一种特性,它允许我们在执行Action之前或之后运行...

    .net mvc 权限设计

    - 还可以使用AuthorizeCore方法自定义权限检查逻辑,以实现更复杂的权限控制。 3. 数据库设计: - SQL Server 2012用于存储用户和角色信息,通常包括AspNetUsers、AspNetRoles、AspNetUserRoles、AspNetClaims等...

    扩展MVC AuthorizeAttribute的行为以基于活动的授权

    在.NET MVC框架中,`AuthorizeAttribute`是用于实现授权控制的关键组件,它允许开发者限制对控制器和动作的访问,仅允许特定用户或角色执行。当我们谈论“扩展MVC AuthorizeAttribute的行为以基于活动的授权”时,...

    asp.net权限管理框架

    - 自定义AuthorizeAttribute或者使用内置的Authorize特性进行权限验证。 - 使用角色提供程序RoleProvider和会员提供程序MembershipProvider扩展权限管理功能。 - 利用AJAX和jQuery等前端技术提高用户体验,如异步...

    微软权限管理文件_微软.NET平台权限管理_

    4. **AuthorizeAttribute**:这是ASP.NET MVC或Web API中的一个特性,用于限制只有特定角色或用户才能访问控制器或操作方法。 5. **FormsAuthentication类**:处理基于表单的身份验证,包括加密和解密票证,以及在...

    【ASP.NET编程知识】Asp.net mvc 权限过滤和单点登录(禁止重复登录).docx

    ASP.NET MVC权限过滤和单点登录...权限控制和单点登录是ASP.NET MVC应用程序中的两个重要概念,通过使用AuthorizeAttribute和FormAuthentication等技术,可以实现权限控制和单点登录,提高应用程序的安全性和可靠性。

    ASP.NET通用权限管理系统_dotnet整站程序.rar

    3. 权限管理:定义并管理各种操作权限,例如增删改查等,可能采用了自定义授权过滤器(AuthorizeAttribute)或特性(Attribute)。 4. 菜单系统:根据用户权限动态生成前端导航菜单,确保只显示用户可访问的功能。 ...

    .NET MVC授权过滤器验证登录

    要创建自定义的授权过滤器,我们需要继承`System.Web.Mvc.AuthorizeAttribute`类。这个类是.NET MVC内置的授权过滤器,用于检查用户是否已通过身份验证。我们可以覆盖它的`OnAuthorization`方法,添加自定义的登录...

    Custom Membership and Role provider(MVC 3)

    总结起来,自定义会员和角色提供者在ASP.NET MVC 3中是实现灵活、安全的用户管理和权限控制的关键。它们允许开发者根据特定需求定制身份验证和授权逻辑,同时保持代码的整洁和可维护性。通过理解这些概念并熟练运用...

    asp.net mvc 菜单权限设置的源代码跟界面的源代码(实用简洁易懂)

    3. **角色基础的权限控制**:在ASP.NET MVC中,可以通过`AuthorizeAttribute`实现基于角色的访问控制。这个特性可以放在控制器或行动方法上,限制只有指定角色的用户才能访问。例如,`[Authorize(Roles = "Admin")]`...

    ASP.NET权限管理框架

    在ASP.NET中,权限管理主要通过角色(Roles)和用户(Users)的概念来实现。角色是一组具有相同权限的用户的集合,用户则代表实际的账户。通过将用户分配到不同的角色,可以轻松地管理大量用户的权限。 1. **身份...

Global site tag (gtag.js) - Google Analytics