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新增

编辑

删除

时间: 2024-10-12 23:23:28

ASP.NET Identity “角色-权限”管理 5的相关文章

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

本文是基于ASP.NET Identity v2的实施的“角色-权限”实验小结,不对基础知识进行介绍,读者需理解面向对象.接口编程.AOP.MVC,掌握ASP.NET MVC.JavaScript和EF. 环境:VS2013 update4,EF6,ASP.NET MVC 5,bootstrap,Automapper,MvcPager等. 1.       前言 VS2013 ASP.NET MVC模板只提供基础的Role-User权限管理,如:账号管理Account,登录注册等,为提高实用性,

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

1.1.       Role管理 参考1:ASP.NET Identity 2.0: Customizing Users and Roles 参考2:asp.net identity 2.2.0 中角色启用和基本使用(一) 1.1.1.      增加ApplicationRole 新建ApplicationRole,可参考ApplicationUser,过程如下所述. 修改IdentityModel.cs,新增ApplicationRole,继承自IdentityRole,增加属性Descr

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

1.1.       Ignite Grid展示数据 Ignite UI提供了基于HTML5与CSS3的控件,需要添加程序集引用Infragistics.Web.Mvc,相应的CSS与JS,该框架需要JQuery UI.Bootstrap和modernizr. 1.1.1.      修改BundleConfig Ignite所需的css与js引用,统一放在BundleConfig中配置. //jquery-ui bundles.Add(new ScriptBundle("~/bundles/j

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

1.1.       Role-Permission UserRole是User与Role的关联表,代码见User-Role分析.参考可得Role-Permission的设计,代码图如下,RolePermission是Role与Permission的关联表,保存着RoleId与PermissionId. 1.1.1.      新建RolePermission 在IdentityModels.cs中增加ApplicationRolePermission类. public class Applic

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

1.       自定义属性 参考:ASP.NET Identity 2.0: Customizing Users and Roles 以扩展ApplicationUser为例. 1.1.       新增Password属性 修改IdentityModel.cs,ApplicationUser继承自IdentityUser,只需为它增加Password属性,用来保存密码明文. public class ApplicationUser : IdentityUser { public Applic

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

1.       验证管理 参考:认识ASP.NET MVC的5种AuthorizationFilter ASP.NET MVC框架中已经提供了基于AOP验证的机制与基本部件,重点是FilterAttribute. 1.1.       新建验证Attribute 基本思路:父类验证逻辑通过,再验证当前用户所属角色是否具备访问权限.MVC已经有了一个权限验证实现AuthorizeAttribute,这里只需要继承该类,重写相应方法,增加自定义验证逻辑即可. 注意:属性Roles和Users中的特

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

1.1.       对象映射 参考1:https://github.com/AutoMapper/AutoMapper 参考2:AutoMapper的配置方法 参考3:使用AutoMapper实现Dto和Model的自由转换(上) 为适应View的变化,将数据封装到ViewModel,从而保持领域模型的纯净稳定,这里使用AutoMapper处理Model与ViewModel之间映射. 1.1.1.      映射类Profile 继承自Profile,每个映射类中就是一套对象间映射规则,根据实

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

1.       典型应用场景 1.1.       EF数据存储 EF的核心是数据上下文DbContext,它提供了基本的数据存储操作方法. 1.1.1.      新增 采用添加对象的方式. //创建权限 var permission = new ApplicationPermission { Id = item.Id, Action = item.Action, Controller = item.Controller, Description = item.Description };

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

1.1.       User-Role分析 想必大家已经注意到了Microsoft.AspNet.Identity.EntityFramework是对Microsoft.AspNet.Identity.Core的EF实现,微软是如何处理IdentityUser与IdentityRole的关系?因两者为多对多关系,会在关系型数据库增加一张关联表,故增加IdentityUserRole,并在IdentityUser与IdentityRole中添加IdentityUserRole列表,代码如下所示.