我不是一名网络开发人员,但每隔几年我就会在电视上玩一次,或者和他们一起玩,看起来很酷。我上一次对ASP.NET赞不绝口是在网络表单时代。当时,使用基于web的用户体验来管理网站上的用户是很简单的。我知道ASP.NET Identity 1.0/2.0和Federation旨在为开发人员提供各种新的发光棒和奶嘴,但打开VS 2013,启动一个新的MVC/SPA web应用程序,却无法轻松地做其他人应该做的事情,也就是通过网站上的一些管理用户体验来管理他们的用户,这让我感到非常沮丧。
所以,如果你是DTC(归根结底是代码),我会很感激任何简单的例子来说明如何做到以下几点(#1是迄今为止最重要的。我可以推断出#2和#3…我希望如此。)。假设没有什么花哨的东西(使用嵌入式SQL DB的本地机器项目。你知道,项目模板默认值。):
- 显示在网站上注册的所有用户及其所属角色。我已经掌握了所有我想直接了解的关于实体框架用户的信息。但为什么这里的角色如此不明显?非常感谢M、V和C的代码段
- 为用户添加或删除角色
- 添加或删除用户的可用角色
我在新的MVC项目中看到了这些表,很像那些一直存在的表。基本的用户内容很容易暴露,但一个老的、值得信赖的、必要的朋友(角色)似乎需要一些巫毒、魔力或秘密酱汁才能以同样简单的方式暴露出来。我离直接通过SQL处理表不远了。我知道这在新的世界秩序中是不好的,很可能会告诉保镖,他们不应该让我在天鹅绒绳索后面参加派对。
p.s.我甚至在这里和其他地方看到过一些帖子,建议用索赔来扮演角色。虽然这似乎是合乎逻辑的,但我更喜欢基于仍然存在的角色(.NET类型、SQL表等)残余的ASP.NET Identity 2.0内容。
我发现这个问题很简单(比以前多得多,至少在会员制方面是这样)。默认安装使用实体框架作为后端,并创建三个表(以及其他表):一个用于用户,一个用于角色,以及一个用于多对多关系。它还为我们提供了两个类,帮助我们管理用户和角色:IdentityUserManager和IdentityRoleManager。使用默认模板,我们可以获得从中继承的类(ApplicationUserManager和ApplicationRoleManager)。通过这些类,我们获得了管理用户和角色的基本功能。
关于您上一次p.s.的最后一条评论:当您登录时,框架将您的角色(存储在数据库中)存储为声明(存储在身份验证cookie中)。您可以通过ApplicationUser.Identity的ClaimsIdentity访问这些声明,这样您就不必每次想知道当前用户的角色时都访问数据库。这也用于授权操作筛选器。
对于1。使用EntityFramework创建具有读/写操作的新控制器(右键单击控制器文件夹),然后选择型号ApplicationUser
。
2和3。您可以将此代码粘贴到Migrations/Configuration.cs
中的Seed
方法中
if (!context.Users.Any()) {
System.Diagnostics.Debug.WriteLine("INSIDE USER SEED");
try {
var store = new UserStore<ApplicationUser>(context);
var userManager = new ApplicationUserManager(store);
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
string roleName = "Admin";
if (!roleManager.RoleExists(roleName)) {
roleManager.Create(new IdentityRole(roleName));
}
roleName = "TeleMarketer";
if (!roleManager.RoleExists(roleName)) {
roleManager.Create(new IdentityRole(roleName));
}
roleName = "Marketer";
if (!roleManager.RoleExists(roleName)) {
roleManager.Create(new IdentityRole(roleName));
}
var user = new ApplicationUser() { Email = "informatyka4444@wp.pl", UserName = "informatyka4444@wp.pl" };
userManager.Create(user, "TestPass44!");
userManager.AddToRole(user.Id, "Admin");
user = new ApplicationUser() { Email = "s8359@pjwstk.edu.pl", UserName = "s8359@pjwstk.edu.pl" };
userManager.Create(user, "TestPass44!");
userManager.AddToRole(user.Id, "Admin");
user = new ApplicationUser() { Email = "marketer@wp.pl", UserName = "marketer@wp.pl" };
userManager.Create(user, "TestPass44!");
userManager.AddToRole(user.Id, "Marketer");
user = new ApplicationUser() { Email = "telemarketer@wp.pl", UserName = "telemarketer@wp.pl" };
userManager.Create(user, "TestPass44!");
userManager.AddToRole(user.Id, "TeleMarketer");
} catch (DbEntityValidationException e) {
System.Diagnostics.Debug.WriteLine("EXC: ");
foreach (DbEntityValidationResult result in e.EntityValidationErrors) {
foreach (DbValidationError error in result.ValidationErrors) {
System.Diagnostics.Debug.WriteLine(error.ErrorMessage);
}
}
}
}