• 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")]的资源了

  • 相关阅读:
    关于Java 下 Snappy压缩存文件
    英文分词和中文分词
    vuex requires a Promise polyfill in this browser
    Vue 中 export default 和 module.exports
    Linux 进程以及多线程的支持
    mysqldump
    linux磁 盘分区 挂载
    ubuntu16.04挂载windows NTFS磁盘方法
    Linux服务管理 systemctl命令详解
    nextcloud 安装
  • 原文地址:https://www.cnblogs.com/amywechat/p/6043270.html
Copyright © 2020-2023  润新知