首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解MVC-5身份

理解MVC-5身份
EN

Stack Overflow用户
提问于 2014-08-04 14:23:44
回答 7查看 8.6K关注 0票数 6

我用ASP.NET MVC-5创建了一个新的Individual User Accounts应用程序,然后更新了解决方案中的所有Nuget packages。现在,我正在尝试遵循一些教程中所示的指导方针,但我遇到了一些问题。第一个是没有创建一个名为ApplicationRoleManager的类,这个类在整个应用程序中都在使用(创建了ApplicationUserManager )。第二个问题更多地是关于Entity-Framework的:我已经看到,为了用用户和角色播种数据库,许多人在ApplicationDbContext类中创建了一个静态构造函数:

代码语言:javascript
复制
    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

所以我添加了它,ApplicationDbInitializer的实现是:

代码语言:javascript
复制
public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
{
    protected override void Seed(ApplicationDbContext context)
    {
        InitializeIdentityForEF(context);
        base.Seed(context);
    }

    //Create User=Admin@Admin.com with password=Admin@123456 in the Admin role
    public static void InitializeIdentityForEF(ApplicationDbContext db)
    {
        var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
        const string name = "admin@admin.com";
        const string password = "Admin@123456";
        const string roleName = "Admin";

        //Create Role Admin if it does not exist
        var role = roleManager.FindByName(roleName);
        if (role == null)
        {
            role = new IdentityRole(roleName);
            var roleresult = roleManager.Create(role);
        }

        var user = userManager.FindByName(name);
        if (user == null)
        {
            user = new ApplicationUser { UserName = name, Email = name };
            var result = userManager.Create(user, password);
            result = userManager.SetLockoutEnabled(user.Id, false);
        }

        // Add user admin to Role Admin if not already added
        var rolesForUser = userManager.GetRoles(user.Id);
        if (!rolesForUser.Contains(role.Name))
        {
            var result = userManager.AddToRole(user.Id, role.Name);
        }
    }

添加所有内容后,我打开Package Manager Console并键入Enable-Migrations,然后是Add-Migration someName,然后是Update-Database。结果是成功创建了数据库,但没有向数据库插入任何数据。

注意到没有插入数据后,我将Seed逻辑移到家庭控制器的索引方法中,并在运行应用程序后插入数据。我还需要将这一行:app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);添加到Startup.Auth.cs文件中。

所以我的问题是:

  1. 我真的需要手动输入ApplicationRoleManager类吗?
  2. 如何使seed方法工作?

更新

我已经将Seed方法更改为:

代码语言:javascript
复制
protected override void Seed(ApplicationDbContext context)
    {
        var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();

        //since there is no ApplicationRoleManager (why is that?) this is how i create it
        var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

        const string name = "admin@admin.com";
        const string password = "Admin@123456";
        const string roleName = "Admin";

        //Create Role Admin if it does not exist
        var role = roleManager.FindByName(roleName);
        if (role == null)
        {
            role = new IdentityRole(roleName);
            var roleresult = roleManager.Create(role);
        }
        //app hangs here...
        var user = userManager.FindByName(name);
        if (user == null)
        {
            user = new ApplicationUser { UserName = name, Email = name };
            var result = userManager.Create(user, password);
            result = userManager.SetLockoutEnabled(user.Id, false);
        }

        // Add user admin to Role Admin if not already added
        var rolesForUser = userManager.GetRoles(user.Id);
        if (!rolesForUser.Contains(role.Name))
        {
            var result = userManager.AddToRole(user.Id, role.Name);
        }
        base.Seed(context);
    }

因此,现在创建了Admin角色,但是当到达var user = userManager.FindByName(name);时,应用程序将毫无例外地挂起,也没有任何消息.

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-08-04 14:35:16

在使用迁移时,可以使用内置的初始化器和Seed方法:

代码语言:javascript
复制
Database.SetInitializer<ApplicationDbContext>(new 
    MigrateDatabaseToLatestVersion<ApplicationDbContext, 
    APPLICATION.Migrations.Configuration>());

APPLICATION.Migrations.Configuration中(这是由Enable-Migrations命令创建的):

代码语言:javascript
复制
protected override void Seed(ApplicationDbContext context)
{
    // seed logic
}

作为角色管理器,您还可以使用RoleManager<ApplicationRole>基本实现。

票数 6
EN

Stack Overflow用户

发布于 2014-12-21 17:36:01

在这种情况下,我也对挂起的应用程序感到有点困惑。这个问题可以这样解决。

代码语言:javascript
复制
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUserManager>(db));
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(db));
票数 3
EN

Stack Overflow用户

发布于 2015-02-11 07:43:23

对于任何使用带有Integer外键的ApplicationUser的人,代码是这样的:

代码语言:javascript
复制
var userManager = new ApplicationUserManager(new ApplicationUserStore(context));
var roleManager = new ApplicationRoleManager(new ApplicationRoleStore(context));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25120942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档