asp.net Identity2 角色(Role)的使用,一初始配置

asp.net Identity自带有角色功能,但默认的模板并没有启用。启用Role的步骤如下:定义role模型--配置角色管理器---配置初始化器---修改数据库上下对象---在应用程序启动文件中配置角色请求

1、定义模型: 在IdentityModel.cs

//定义程序的角色模型,继承自IdentityRole

public class ApplicationRole : IdentityRole

{

public ApplicationRole():base() {}

public ApplicationRole(string roleName) :base(roleName){}

[Display(Name="角色描述")]

[StringLength(50,ErrorMessage="{0}不能超过50个字符")]

public string Description { get; set; }

}

2、配置应用程序角色管理器 IdentityConfig.cs

// 配置此应用程序中使用的应用程序角色管理器。RoleManager 在 ASP.NET Identity 中定义,并由此应用程序使用。

public class ApplicationRoleManager : RoleManager<ApplicationRole>

{

public ApplicationRoleManager(IRoleStore<ApplicationRole, string> roleStore)

: base(roleStore)

{ }

public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)

{

return new ApplicationRoleManager(new RoleStore<ApplicationRole>(context.Get<ApplicationDbContext>()));

}

}

3、//配置应用程序初始化器 ,设置数据库初始化器,它就在应用程序运行的时候加载。

//在初始化器中需要建立一个管理员角色和一个具有管理员角色的账户。 IdentityConfig.cs

public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext> //如果模型改变就删除原有数据库,重新创建一个数据库,同时,已有的数据将会丢失。

{

protected override void Seed(ApplicationDbContext context) //建立种子方法,当模型改变需要重新建一个数据库的时候,用默认的数据填充数据库。

{

var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); //取得userManager ,或者使用new ApplicationUserManager(new UserStore<ApplicationUser>(context));

var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();

//创建角色列表

var roles =new List<ApplicationRole>

{

new ApplicationRole { Name="SuperAdmin",Description="系统超级管理员--负责用户角色管理,资源上传等所有权限"},

new ApplicationRole { Name="Teacher",Description="专业教师--可以上传资源和发布消息。栏目设置"},

new ApplicationRole { Name="Student",Description ="学生--可以查看上传资源的内容,但不能进行后台设置。"},

new ApplicationRole { Name ="Expert",Description ="专家--可以查看上传资源的内容,但不能进行后台设置"}

};

foreach(var role in roles) //遍历列表,如果数据库中不存在列表中某个角色,就添加角色

{

var _role =roleManager.FindByName(role.Name);

if(_role == null)

{

var roleResult =roleManager.Create(role); //创建角色。

}

}

// roles.ForEach(s => context.Roles.Add(s));

// context.SaveChanges();

//创建用户列表

var users =new List<ApplicationUser>

{

new ApplicationUser { Email="jwc@ybzy.cn",UserName="administrator",RealName="教务处",Gender= Gender.男,Birthday=DateTime.Parse("2002-7-1")},

new ApplicationUser { Email="yuanhaoliu@vip.qq.com",UserName="liuyuanhao",RealName="刘元浩",Gender= Gender.男,Birthday=DateTime.Parse("1982-5-21")},

};

//创建用户并设置不锁定用户

// users.ForEach(s => userManager.Create(s,"Ybzy"+s.Email));

// users.ForEach(s =>userManager.SetLockoutEnabled(s.Id,false));

foreach(var user in users) //遍历用户列表,如果数据库中不存在列表中的某个用户,就添加这个用户。

{

var _user =userManager.FindByName(user.UserName);

if(_user == null)

{

var userResult =userManager.Create(user,"Ybzy"+user.Email); //创建用户和密码,

var userLockResult =userManager.SetLockoutEnabled(user.Id,false); //不锁定此用户。

}

}

//给用户添加角色

/* foreach(var user in users)

{

userManager.AddToRoles(userManager.FindByName(user.UserName).Id,roles.Select(c =>c.Name).ToArray()));

}

*/

foreach(var user in users)

{

var _user =userManager.FindByName(user.UserName); //通过用户名在数据库中找到这个用户。

var rolesForUser =userManager.GetRoles(_user.Id); //通过用户ID 找到此用户所拥有的角色。

foreach (var role in roles)

{

if(!rolesForUser.Contains(role.Name)) //如果用户没有拥有此角色。通过用户名。

{

var result =userManager.AddToRoles(user.Id,role.Name); //将该用户加入此角色。

}

}

}

//以下块注解为最开始的方案,就只创建一个系统管理员账户;

/*

ApplicationUser _user = new ApplicationUser { Id = Guid.NewGuid().ToString(), UserName = "administrator", Email = "jwc@ybzy.cn", RealName = "教务处", Gender = Gender.男, Birthday = DateTime.Parse("2015/5/1") };

var result = userManager.FindByName(_user.UserName);

if (result == null)

{

userManager.Create(_user, "$Ifkmjb9f");

userManager.SetLockoutEnabled(_user.Id, false);

}

**/

base.Seed(context); //运行父类的方法。

}

}

4、更改应用程序数据库上下文对象。 IdentityConfig.cs

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

{

public ApplicationDbContext()

: base("DefaultConnection", throwIfV1Schema: false)

{

}

public static ApplicationDbContext Create()

{

return new ApplicationDbContext();

}

//静态构造函数。MSDN:静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。 当程序部署在服务器上时,当第一次登陆的时候,就执行这个初始化器,并填充数据库。

static ApplicationDbContext() //静态构造函数不需要有public 或private 修饰符。

{

//设置数据库初始化器,它就在应用程序运行的时候加载。

//在初始化器中需要建立一个管理员角色和一个具有管理员角色的账户。

Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer()); //在System.Data.Entity 命名空间下面。

}

}

5、 //配置角色管理器,以便为每个请求使用单个实例 Start.Auth.cs

public partial class Startup

{

// 有关配置身份验证的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=301864

public void ConfigureAuth(IAppBuilder app)

{

// 配置数据库上下文、用户管理器和登录管理器,以便为每个请求使用单个实例

app.CreatePerOwinContext(ApplicationDbContext.Create);

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

//配置角色管理器,以便为每个请求使用单个实例 //增加的注释

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);