RoleManager 进行角色管理
ASP.NET Identity 使用 RoleManager 进行角色管理 (VS2013RC)
注:本文系作者原创,但可随意转载。
最近做一个Web平台系统,系统包含3个角色,“管理员, 企业用户, 评审专家”, 分别有不同的功能。一直以来都是使用微软封装好的Microsoft.AspNet.Identity.dll程序集来进行身份验证和角色控制。
在MVC项目中,生成项目结构中,甚至已经包含了创建好的AccountController,可以直接使用进行账号管理。不过最近一次使用Identity功能,是在Visual Studio 2013的Preview版本中,现在升级到了RC和Ultimate版,整个程序集已经彻底翻新了。想进行角色控制,我了个擦发现Account控制器中初始化的一个控制类UserManager已经根本不包含角色控制的方法了。。。于是乎,开始上网查资料,搜索"ASP.NET Identity Role(Manager)",但发现大部分都是零几年的文章了,微软官方博客里倒是看到了相关的讲解,很详细,但尼玛是Preview版本的啊,后面有人追问正式版的也没有答复。于是懒得再找了,打开dotPeek对整个程序集进行反编译,看一下内部代码到底是如何实现角色控制的。
先看一下本文问题背景的具体情况。下面有一段代码介绍了AccountController的构造方法,其中的LCDEUser,LCDEDbContext是我定义的继承了IdentityUser和DbContext的应用程序的账号实体类和数据库上下文类,由于Identity本身是基于EntityFramework来实现的。这里就不再介绍EF,假定您对EF已经了解。Account控制器的构造方法中初始化了一个UserManager管理类,这个类可以进行创建账号,修改密码。。。等各种账号管理功能,还有一个方法叫AddToRole(..),意思是把一个账号(User)与一个角色(Role)进行关联,关键是现在根本就不存在任何角色,UserManager类也不提供创建角色的方法。
AccountController
Identity功能主要由3个程序集组成。Microsoft.AspNet.Identity.Core / EntityFramework / Owin 其中Owin和第三方登陆相关,此处我暂时用不到就先不看了。
用反编译工具打开程序集后如图1。


图1 图2
图2中是Identity自动生成的几张数据库表,看起来和左边程序中的几个类名一致。打开一看果然 左侧程序集中的IdentityRole, IdentityUser, IdentityUserClaim, IdentityUserLogin, IdentityUserRole分别是实体模型类,包含的属性和数据库中的表的字段一致。其中的EntityStore作为泛型类提供了几个基本操作Create,Delete,GetById。 RoleStore<T>用来操作和角色控制相关的实体数据,UserStore<T>用来操作和账号相关的实体数据,其中提供了诸多的方法,而这两个类的访问权限又是Public的,可以认为只是使用这两个类也可以进行一些数据实体的访问和存储操作。
  
图3
图3是使用反编译工具打开Core.dll后看到的内部构造。其中东西颇多不一一介绍,主要介绍一下我们要用到的。打开后发现其中有一个UserManager类,这不正是我们用来进行账号管理的类么,还有一个RoleManager类,肯定就是进行角色控制的了,可是没有相关文档,项目的初始架构中又没有帮我们初始化这个东西,而它的构造函数又有点复杂(主要是传入参数中还要new 一些RoleStore, DbContext之类的东西),不打开看看相关代码或文档,想要直接使用还是有点困难撒,主要是万一用错了折腾起来太费时间。
打开RoleManager类后看到这么一段代码:
RoleManager
它的构造函数需要传递一个RoleStore进去,实际上RoleManager就是提供了比RoleStore更多方法,方法名称更具可读性,更方便编程的一个类,因此不推荐直接使用RoleStore来进行数据的访问及存储。而RoleStore的构造方法需要传递一个DbContext给它,搞清楚怎么初始化它,就可以正式使用了。下面参考一段,对数据库进行初始化,建立种子数据的代码,其中包括的对UserManager和RoleManager的具体使用。
Seed方法
在使用中还有一些其他需要注意的事项,在MVC中,通常我会做一个BaseController,其中包含了dbcontext,usermanager的实例创建, 假如首先实例化一个dbcontext,再去实例化一个usermanager,由于usermanager的实例化需要传入一个dbcontext,我尝试将实例化好的dbcontext实体传入,在本机运行时,没有问题,但发布到服务器上时,会出现DataReader的使用冲突,于是在usermanager进行构造时,要传入一个new DbContext()给它。
RoleManager 进行角色管理的更多相关文章
- roleManager与角色管理授权
		
总览地址 https://msdn.microsoft.com/zh-cn/library/9ab2fxh0.aspx 其中基本概述是第一篇:了解角色管理 来自 <https://msdn.mi ...
 - ASP.NET Identity 使用 RoleManager 进行角色管理 (VS2013RC)
		
注:本文系作者原创,但可随意转载. 最近做一个Web平台系统,系统包含3个角色,“管理员, 企业用户, 评审专家”, 分别有不同的功能.一直以来都是使用微软封装好的Microsoft.AspNet.I ...
 - Module Zero之角色管理
		
返回<Module Zero学习目录> 角色实体 角色管理者 多租户 角色实体 角色实体代表了该应用的一个角色.它应该派生自AbpRole类,如下所示: public class Role ...
 - ASP.NET成员资格与角色管理配置内容
		
Web.config中进行配置 以便于连接数据库,使用微软提供的Membership类.·····等 <?xml version="1.0" encoding=" ...
 - ASP.NET Identity 角色管理(Roles)
		
当我们使用ASP.NET 4.5创建模板项目时,会发现模板只提供了ApplicationUserManager用于用户的登录注册.修改.设置等,而没有提供与用户角色相关的代码,对此就需要我们自己手动的 ...
 - Identity角色管理一(准备工作)
		
因角色管理需要有用户才能进行(需要将用户从角色中添加,删除)故角色管理代码依托用户管理 只需在Startup服务中添加角色管理即可完成 public void ConfigureServices(IS ...
 - SQL Server 2012 新特性:服务角色管理
		
数据库角色管理,已经可以使用alter role,create role和drop role. 2012增加了几个ddl语句,可以操作服务级别的角色管理, CREATE SERVER ROLE 用 ...
 - 七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理
		
系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...
 - 安装 SQL SERVER 2008 必须使用 "角色管理工具" 错误 的 解决方案 (转)
		
刚在服务器(Win2008)上安装SqlServer2008的时候出现了这么一个报错——必须使用“角色管理工具”安装或配置Microsoft .NET Framework 3.5 SP1.一开始以为是 ...
 
随机推荐
- CodeIgniter入门——HelloWorld
			
原文:CodeIgniter入门--HelloWorld CodeIgniter(CI)是一套给PHP网站开发者使用的应用程序开发框架和工具包. 初次接触,来一个HelloWorld~~~ ^_^ 准 ...
 - 解决RecyclerView无法onItemClick问题
			
供RecyclerView采用.会员可以查看将替代ListView的RecyclerView 的使用(一),单单从代码结构来说RecyclerView确实比ListView优化了非常多.也简化了我们编 ...
 - ASP.NET 5 Web 项目
			
在Mac OS X Yosemite 10.10.3 中搭建第一个 ASP.NET 5 Web 项目 终于有时间在 Mac 上安装一下 ASP.NET 5,网上有许多教程,但是多数的时间比较早了,版本 ...
 - C语言qsort函数算法性能测试
			
对于该算法的复杂性.一个直接的方法是测量的一定量的算法级数据的执行时间的感知. 随着C语言提供qsort对于示例.随着100一万次的数据,以测试其计算量.感知O(nlg(n))时间成本: C码如下面: ...
 - Android Wear 开发入门——怎样创建一个手机与可穿戴设备关联的通知(Notification)
			
创建通知 为了创建在手机与可穿戴设备中都能展现的通知,能够使用 NotificationCompat.Builder.通过该类创建的通知,系统会处理该通知是否展如今手机或者穿戴设备中. 导入必要的类库 ...
 - JS读写Cookie(设置、读取、删除)
			
JS读写Cookie(设置.读取.删除) Cookie是客户端存放数据的一种方式,可用来做状态保持. 1.设置Cookie: a.无过期时间:(若不设置过期时间,默认为会话级Cookie,浏览器关闭就 ...
 - Responsive Design in 3 Steps
			
Responsive web design is no doubt a big thing now. If you still not familiar with responsive design, ...
 - centos安装zabbix集群监控(亲测无坑版)
			
一. 安装lemp环境 下载安装包:wget bbs.linuxtone.org/docs/autoinstall/lemp_auto_v1.0.6.tar.gz 包解压:tar zxvf lemp_ ...
 - C# 复习(1) 委托与事件
			
委托定义顺序 1. 声明一个委托 2.定义一个委托变量 3. 委托变量的初始化或者给委托变量绑定一个方法 4.调用委托 事件:事件是对委托的封装. 事件只能在创建事件的类的内部调用. public c ...
 - 设计模式学习--Factory Method
			
What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...