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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM