• ASP.NET Identity “角色-权限”管理 5


    1.1.       Permission管理

    参考1:Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理

    参考2:ASP.NET MVC三个重要的描述对象:ActionDescriptor

    这里Permission指的是Action,即供用户调用的功能。

    1.1.1.      新建ApplicationPermission

    修改IdentityModel.cs,新增ApplicationPermission,此处设计了属性Id、Controller、Action、Params、Description。

    public class ApplicationPermission

    {

        public ApplicationPermission()

        {

            Id = Guid.NewGuid().ToString();

            Roles = new List<ApplicationRolePermission>();

        }

        /// <summary>

        /// 主键

        /// </summary>

        public string Id { get; set; }

        /// <summary>

        /// 控制器名

        /// </summary>

        public string Controller { get; set; }

        /// <summary>

        /// 方法名

        /// </summary>

        public string Action { get; set; }

        /// <summary>

        /// 参数字符串

        /// </summary>

        public string Params { get; set; }

        /// <summary>

        /// 功能描述

        /// </summary>

        public string Description { get; set; }

    }

    1.1.2.      建立ViewModel

    在AdminViewModel.cs中添加PermissionViewModel。

    public class PermissionViewModel

    {

        /// <summary>

        /// 主键

        /// </summary>

        [Display(Name = "权限ID")]

        public string Id { get; set; }

        /// <summary>

        /// 控制器名

        /// </summary>

        [Required(AllowEmptyStrings = false)]

        [Display(Name = "控制器名")]

        public string Controller { get; set; }

        /// <summary>

        /// 方法名

        /// </summary>

        [Required(AllowEmptyStrings = false)]

        [Display(Name = "方法名")]

        public string Action { get; set; }

        /// <summary>

        /// 功能描述

        /// </summary>

        [Required(AllowEmptyStrings = true)]

        [Display(Name = "功能描述")]

        public string Description { get; set; }

        [Display(Name = "选择")]

        public bool Selected { get; set; }

    }

    1.1.3.      自动获取Permission

    核心思想:利用反射机制读取各Action的元数据,如:所属Controller、Action名称、参数、功能描述,为此要使用特性Description。

    1)        特性Description示例

    添加引用System.ComponentModel,为Action添加Description特性。

    using System.ComponentModel;

     

    public class UsersAdminController : BaseController

    {

     

        // GET: UsersAdmin

        [Description("用户列表")]

        public async Task<ActionResult> Index()

        {

            return View(await _userManager.Users.ToListAsync());

    }

    省略部分代码…

    2)        读取程序集中Action信息

    新建ActionPermissionService.cs,利用MVC中的ReflectedControllerDescriptor与ActionDescriptor获取元数据。

    internal static class ActionPermissionService

    {

        /// <summary>

        /// 使用Descriptor,取程序集中所有Action的元数据

        /// </summary>

        /// <returns></returns>

        public static IEnumerable<ApplicationPermission> GetAllActionByAssembly()

        {

            var result = new List<ApplicationPermission>();

            //取程序集中的全部类型

            var types = Assembly.Load("AspNetIdentity2Permission.Mvc").GetTypes();

            //取控制器

            foreach (var type in types)

            {

                if (type.BaseType == typeof(BaseController))//如果是BaseController               

                {

                    //反射控制器

                    var controller = new ReflectedControllerDescriptor(type);

                    //取控制器的Action,共有实例方法

                    var actions = controller.GetCanonicalActions();

                    //构建权限

                    foreach (var action in actions)

                    {

                        //创建权限

                        var ap = new ApplicationPermission()

                        {

                            Action = action.ActionName,

                            Controller = controller.ControllerName,

                            //Params = FormatParams(action),

                            Description = GetDescription(action)

                        };

                        result.Add(ap);

                    }

                }

            }

            return result;

        }

    }

    获取Action的Description特性中的描述信息,因为ActionDescriptor实现了接口ICustomAttributeProvider,所以传入参数类型为接口。

    /// <summary>

    /// 取Action的描述文本

    /// </summary>

    /// <param name="action"></param>

    /// <returns></returns>

    public static string GetDescription(ICustomAttributeProvider action)

    {

        //取自定义特性数组

        var description = action.GetCustomAttributes(typeof(DescriptionAttribute), false);

        //取出Description,否则为空

        var result = description.Length > 0 ? (description[0] as DescriptionAttribute).Description : null;

        return result;

    }

        格式化Action的参数。

    /// <summary>

    /// 格式化Action的参数字符串

    /// </summary>

    /// <param name="action"></param>

    /// <returns></returns>

    public static string FormatParams(ActionDescriptor action)

    {

        var param = action.GetParameters();

        var result = new StringBuilder();

        if (param.Length > 0)

        {

            foreach (var item in param)

            {

                result.Append(string.Format("Type:{0}, Name:{1}; ", item.ParameterType, item.ParameterName));

            }

            return result.ToString();

        }

        else

        {

            return null;

        }

    }

    1.1.4.      CRUD管理功能

    为Permission添加相应的MVC部件,这里不再累述可参考前面章节。

    1.1.5.      运行效果

    Index列表

    Create新增

    编辑

    删除

  • 相关阅读:
    隐藏win10中“此电脑”里的6个子文件夹
    k2安装LEDE
    ubuntu下用apt-get安装lamp缺少mcrypt , curl
    Devexpress TreeList选择父级联动
    iPhone10.3.X越狱后SSH连接不上的问题(已解决)
    C#保存Base64格式图片
    PHP服务器文件管理器开发小结(九):jQuery动态表单实现文件下载
    利用Content-disposition实现无刷新下载图片文件
    jQuery多文件下载
    参考资料
  • 原文地址:https://www.cnblogs.com/mlemon/p/4304588.html
Copyright © 2020-2023  润新知