Owin+ASP.NET Identity浅析系列(四)实现用户角色
在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《Owin+ASP.NET Identity浅析系列》来祭奠那逝去的……
通过Owin+ASP.NET Identity浅析系列(三)框架结构分析一文,我们大概了解了IdentityModels、IdentityConfig和Startup三个文件是做什么的
使用VS2015新建MVC项目之后,我们翻阅这三个文件会发现,微软并没有帮我们生成角色的相关代码,但是项目中只要牵涉到会员,就很少不牵涉角色的,蛋疼啊!!!好吧,还好Identity很强大,我们只需要写一些类似ApplicationUser的代码就可以实现会员角色功能了,开始折腾!!!
因为微软和Identity的强大,我们只需要仿写ApplicationUser的代码即可!
第一步:做下数据库准备吧,微软很蛋疼,如果你使用它的角色管理器新建角色,角色表必须包含一个字段Discriminator,这个字段的意思是区分IdentityRole和你自己的Role,因此我们不得不在表里添加一个这样的字段(谁让微软已经造好了轮子,咱就用吧)
create table aspnetroles
(
Id char(32) primary key,
Name varchar(50) not null comment '角色名称',
Discriminator varchar(50) null comment '区分IdentityRole和自定义Role',
Description varchar(100) null comment '描述',
CreateTime datetime not null comment '创建时间'
) comment '用户角色表';
备注:描述和创建时间字段,是我扩展的字段,仿照扩展用户属性
第二步:在IdentityModels类文件中新建ApplicationRole实体类(是不是跟ApplicationUser很类似)
// 可以通过向 ApplicationRole 类添加更多属性来为角色添加配置文件数据
public class ApplicationRole : IdentityRole
{
/// <summary>
/// 角色描述
/// </summary>
public string Description { get; set; } /// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; } public ApplicationRole()
{
this.Id = System.Guid.NewGuid().ToString("N");
}
}
第三步:在IdentityConfig类文件中新建ApplicationRoleManager角色管理器
// 配置此应用程序中使用的应用程序角色管理器。RoleManager 在 ASP.NET Identity 中定义,并由此应用程序使用。
public class ApplicationRoleManager : RoleManager<ApplicationRole>
{
public ApplicationRoleManager(IRoleStore<ApplicationRole, string> store) : base(store) { } public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
{
return new ApplicationRoleManager(new RoleStore<ApplicationRole>(context.Get<ApplicationDbContext>()));
}
}
第四步:在Startup.Auth类文件中,配置角色管理器
// 配置数据库上下文、用户管理器、角色管理器和登录管理器,以便为每个请求使用单个实例
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
第五步:OK到此,我们就可以像获取用户管理器一样,获取角色管理器了
protected IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } } protected ApplicationUserManager UserManager { get { return HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); } } protected ApplicationRoleManager RoleManager { get { return HttpContext.GetOwinContext().GetUserManager<ApplicationRoleManager>(); } }
备注:拿到角色管理器后,你可以通过RoleManager.AddToRole(userId, roleName)方法将用户加入角色,这样这个用户就可以访问被标注[Authorize(Roles = "roleName")]的资源了
最新文章
- DateHelper.cs日期时间操作辅助类C#
- NYOJ 70
- 设计模式--工厂模式Factory(创建型)
- jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示
- jmx server 和jmx client
- Winform开发框架中实现信息阅读状态的显示和存储
- ArcGIS Server 10.1 错误 service failed to start,
- Unity3D学习笔记
- python yield
- Tile-Based Deferred Rendering
- Oracle 相关概念详解
- Annotations:注解
- elk 索引
- 在github上搭建免费的博客
- Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数
- J2EE进阶(七)利用SSH框架根据数据表建立model类
- 中标麒麟(linux)下Qt调用python数据转换
- 2018.12.21 浪在ACM 集训队第十次测试赛
- centos7 设置时区和时间
- SimpleDateFormat是线程不安全的,切忌切忌!