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

};

_db.Permissions.Add(permission);

//保存

await _db.SaveChangesAsync();

1.1.2.      修改

采用修改实体状态的方式。


_db.Entry(applicationPermission).State = EntityState.Modified;

_db.SaveChanges();

1.1.3.      删除

采用移除对象的方式。


ApplicationPermission applicationPermission = _db.Permissions.Find(id);

_db.Permissions.Remove(applicationPermission);

_db.SaveChanges();

采用修改实体状态的方式。


//删除Permission

var entity = new ApplicationRolePermission { RoleId = roleId, PermissionId = permissionId };

_db.Set<ApplicationRolePermission>().Attach(entity);

_db.Entry(entity).State = EntityState.Deleted;

var result = await _db.SaveChangesAsync();

1.1.4.      查询

示例项目中的部分代码。


//取数据上下文

var context = HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>();

//取角色

var role = context.Roles.Include(r => r.Permissions).FirstOrDefault(t => t.Id == roleId);

//取权限ID列表

var rolePermissionIds = role.Permissions.Select(t => t.PermissionId);

//取权限列表

permissions = context.Permissions.Where(p => rolePermissionIds.Contains(p.Id)).ToList();

var permissions = await _db.Permissions.ToListAsync();

ApplicationPermission applicationPermission = _db.Permissions.Find(id);

1.2.       自定义比较器

1.2.1.      相等比较IEqualityComparer

ApplicationPermission对象是否相等需要依次比较Controller、Action和Description,属于自定义规则,为此比较器要实现相等比较接口IEqualityComparer。


public class ApplicationPermissionEqualityComparer : IEqualityComparer<ApplicationPermission>

{

public bool Equals(ApplicationPermission x, ApplicationPermission y)

{

//先比较ID

if (string.Compare(x.Id, y.Id, true) == 0)

{

return true;

}

//而后比较Controller,Action,Description和Params

if (x.Controller == y.Controller || x.Action == y.Action || x.Description == y.Description )

{

return true;

}

else

{

return false;

}

}

public int GetHashCode(ApplicationPermission obj)

{

var str = string.Format("{0}-{1}-{2}", obj.Controller, obj.Action, obj.Description);

return str.GetHashCode();

}

}

在Contains中使用比较器。


//是否授权

if (rolePermissions.Contains(action, new ApplicationPermissionEqualityComparer()))

{

return true;

}

else

{

return false;

}

在Except中使用比较器。


//取程序集中权限

var allPermissions = _permissionsOfAssembly;

//取数据库已有权限

var dbPermissions = _db.Permissions.ToList();

//取两者差集

var permissions = allPermissions.Except(dbPermissions, new ApplicationPermissionEqualityComparer());

1.2.2.      大小比较IComparer

PermissionViewModel需要按Controller、Action进行排序,属于自定义规则,为此比较器要实现大小比较接口IComparer。


public class PermissionViewModelComparer : IComparer<PermissionViewModel>

{

public int Compare(PermissionViewModel x, PermissionViewModel y)

{

//id相同,则相等

if (string.Compare(x.Id, y.Id, true) == 0)

{

return 0;

}

//controller比较

var controllerCompareResult = string.Compare(x.Controller, y.Controller, true);

//action比较

var actionCompareResult = string.Compare(x.Action, y.Action, true);

//先比较controller,后比较action

if (controllerCompareResult != 0)

{

return controllerCompareResult;

}

else

{

return actionCompareResult;

}

}

}

使用比较器。


//排序

permissionViews.Sort(new PermissionViewModelComparer());

时间: 2024-10-12 16:35:28

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

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 “角色-权限”管理 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.Pa

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 “角色-权限”管理 4

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