缺少用于管理用户角色的Identity 2.0+样本的MVC

时间:2014-09-20 20:35:49

标签: asp.net-mvc model-view-controller asp.net-identity identity asp.net-identity-2

我不是一个网络开发者,但每隔几年我就会在电视上播放一个或者和他们一起看起来很酷。我最后一次狂热使用ASP.NET回到了webform时代。那时候,拥有基于Web的用户体验来管理网站上的用户非常简单。我理解ASP.NET Identity 1.0 / 2.0和联合会旨在为开发人员提供各种新的发光棒和奶嘴,但是让我惊讶地打开VS 2013,启动一个新的MVC / SPA网络应用程序,不能轻易做其他人应该需要和可能做的事情,这是通过网站本身的一些管理员用户管理他们的用户。

所以,如果你是DTC(下到代码),我会很感激如何做到以下的任何简单例子(#1是迄今为止最重要的。我可以推断为#2和#3 ...我希望。)。假设没什么特别的(使用嵌入式SQL DB的本地机器项目。你知道,项目模板是默认的。):

  1. 显示在网站上注册的所有用户以及他们所属的角色。我已经拥有了我想要的所有直接了解用户实体框架的用户。但为什么角色在这里不明显? M,V和C的片段非常受欢迎。
  2. 为用户添加或删除角色。
  3. 为用户添加或删除可用角色。
  4. 在新的MVC项目中,我看到了表格,就像永远存在的表格一样。基本用户的东西很容易暴露,但是一个老的,可信赖的和必要的朋友(角色)似乎需要一些伏都教,魔法或秘密酱以同样简单的方式暴露。我不是直接通过SQL来破坏表格。我知道在新的世界秩序中这是不好的,并且可能会让保镖小心翼翼,他们不应该让我进入天鹅绒绳索后面的聚会。

    P.S。我甚至在这里和其他地方看过一些帖子,建议角色可以完成索赔。虽然这似乎是合乎逻辑的,但我更喜欢ASP.NET Identity 2.0基于仍存在的角色残留(.NET类型,SQL表等)。

2 个答案:

答案 0 :(得分:1)

我发现这个问题非常简单(比以前更多,至少在会员制度下)。默认安装使用Entity Framework作为其后端,并创建三个表(以及其他表):一个用于用户,一个用于角色,一个用于多对多关系。它还为我们提供了两个类,帮助我们管理用户和角色:IdentityUserManager和IdentityRoleManager。使用默认模板,我们可以获得从这些继承的类(ApplicationUserManager和ApplicationRoleManager)。通过这些类,我们可以获得管理用户和角色的基本功能。

关于你上一次p.s的最后评论:当你登录时,框架会将你的角色(存储在数据库中)存储为声明(存储在身份验证cookie中)。您可以通过ApplicationUser.Identity的ClaimsIdentity访问这些声明,这样您每次想要了解当前用户的角色时都不必访问数据库。这也用于授权操作过滤器。

答案 1 :(得分:0)

对于1.使用EntityFramework创建具有读/写操作的新控制器(右键单击controllers文件夹)并选择模型ApplicationUser

2和3.您可以将此代码粘贴到Seed

中的Migrations/Configuration.cs方法中
 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);
                        }
                    }

                }
            }
相关问题