zoukankan      html  css  js  c++  java
  • 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")]的资源了

  • 相关阅读:
    javaweb地图定位demo
    java基础循环
    java实现时钟
    栈和队列
    线程池
    java死锁及解决方案
    克隆
    算法与数据结构基础一
    重定向与转发的区别
    省选模拟57
  • 原文地址:https://www.cnblogs.com/amywechat/p/6043270.html
Copyright © 2011-2022 走看看