如何在mvc5中创建身份2中的角色

时间:2015-10-26 07:36:47

标签: c# asp.net-mvc

这是我的ApplicationUser和dbContext类

public class ApplicationUser : IdentityUser
{

    public int? studentID { get; set; }
    [ForeignKey("studentID")]
    public virtual Student Student { get; set; }
}


public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {

    }
    public DbSet<ApplicationRole> ApplicationRoles { get; set; }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

和我的应用程序角色类

public class ApplicationRole : IdentityRole
{
    public ApplicationRole(string name)
        : base(name)
    { }

    public ApplicationRole()
    { }

    public string Description { get; set; }
}

在我的角色控制器

public class RolesController : Controller
{
    private ApplicationDbContext db = new ApplicationDbContext();

    // GET: /Roles/
    public ActionResult Index()
    {
        return View(db.Roles.ToList());
    }

db.Roles.ToList()没有显示任何内容。但我在数据库中放了一些角色。  db.Roles.ToList()不返回任何列表。显示&#34;枚举没有产生结果&#34;

请帮帮我。 我想创建角色,我必须将roleID用作另一个表作为外键。 这有什么不对。我需要一个简单的解决方案 谢谢。

2 个答案:

答案 0 :(得分:1)

我觉得这样做的最好方法是迁移(如果不存在则创建):

internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(ApplicationDbContext context)
    {
        ParameterSeeder.Seed(context);
        RoleSeeder.Seed(context);
        UserSeeder.Seed(context);
    }
}

然后为您的用户创建自定义播种机,以及角色

internal static class RoleSeeder
{
    internal static void Seed(ApplicationDbContext context)
    {
        CreateRole("Admin", "Administrator");
    }

    private static void CreateRole(string name, string description)
    {
        var idManager = new IdentityManager();

        var newRole = new Role
        {
            Name = name,
            Description = description
        };

        if (!idManager.RoleExists(newRole.Name))
            idManager.CreateRole(newRole.Name, newRole.Description);
    }
}

您的IdentityManager,您将在应用程序中使用更多,仅用于种子:

public class IdentityManager
{
    public bool RoleExists(string name)
    {
        var rm = new RoleManager<Role>(new RoleStore<Role>(new ApplicationDbContext()));

        return rm.RoleExists(name);
    }

    public bool CreateRole(string name, string description)
    {
        var rm = new RoleManager<Role>(new RoleStore<Role>(new ApplicationDbContext()));

        var newRole = new Role { Description = description, Name = name };
        var idResult = rm.Create(newRole);

        return idResult.Succeeded;
    }

    public bool CreateUser(User user, string password)
    {
        var um = new UserManager<User>(new UserStore<User>(new ApplicationDbContext()));
        um.UserValidator = new UserValidator<User>(um)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = false
        };

        user.UserInfo.ModifiedDate = DateTime.Now;
        user.UserInfo.ModifiedBy = "Migrations";
        user.UserInfo.ValidFrom = DateTime.Now;

        var idResult = um.Create(user, password);

        return idResult.Succeeded;
    }

    public bool AddUserToRole(string userId, string roleName)
    {
        var um = new UserManager<User>(new UserStore<User>(new ApplicationDbContext()));
        um.UserValidator = new UserValidator<User>(um)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = false
        };

        var idResult = um.AddToRole(userId, roleName);

        return idResult.Succeeded;
    }
}

希望这能帮助你......

答案 1 :(得分:0)

我在设置中看到的一个问题是

public DbSet<ApplicationRole> ApplicationRoles { get; set; }

您无需添加此内容,因为在您初始化上下文后,角色就可用了

private ApplicationDbContext db = new ApplicationDbContext();

然后你的

// GET: Roles
public ActionResult AllRoles()
{
   return View(db.Roles.ToList());
}

应该有用。

当你添加它时,脚手架可能会在IdentityModels中的ApplicationDbContext中添加一个Dbset。继续删除它,因为您的上下文中已经有一组角色,您可以使用db.Roles

访问它

现在您可以为此创建视图。像

这样的东西
@model IEnumerable<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>
<table class="table">
<tr>
    <th>Role</th>
</tr>
@foreach (var item in Model)
{
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Name)
    </td>
    <td>
}
</table>

有多个资源解释如何为用户和角色设定种子,因此我将介绍如何从UI创建角色,就像管理控制台一样,因为我发现大多数资源可用过于复杂或与其他资源不一致处理自定义模型。

要从UI创建角色,您需要一个像

这样的控制器
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CreateRole([Bind(Include = "Id, Name")] IdentityRole role)
    {
        if (ModelState.IsValid)
        {
            db.Roles.Add(role);
            db.SaveChanges();
            //If everything is good, save changes and redirect the user to the page with the list of all the roles.
            return RedirectToAction("AllRoles");
        }
        //If data is not valid return the original view with what the user has filled in.
        return View(role);
    }

这是基本工作,但您可以添加权限,验证和错误消息。为这个控制器创建一个合适的视图,这不应该太困难。在模型的视图中,使用

@model Microsoft.AspNet.Identity.EntityFramework.IdentityRole