了解MVC-5身份
我使用Individual User Accounts
创建了一个新的ASP.NET MVC-5
应用程序,然后更新了解决方案中的所有Nuget packages
。 现在我试图遵循一些教程中显示的一些指导原则,但我遇到了一些问题。 第一个是没有创建在整个应用程序中使用的名为ApplicationRoleManager
的类( ApplicationUserManager
已创建)。 第二个问题更多的是关于Entity-Framework
:我已经看到,为了用一个用户和角色播种数据库,许多人在ApplicationDbContext
类中创建一个静态构造函数:
static ApplicationDbContext() { Database.SetInitializer(new ApplicationDbInitializer()); }
所以我添加了它, ApplicationDbInitializer
的实现是:
public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges { 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(); var roleManager = HttpContext.Current.GetOwinContext().Get(); 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
逻辑移动到主控制器的Index方法,并在运行应用程序后插入数据。 我还需要添加以下行: app.CreatePerOwinContext(ApplicationRoleManager.Create);
到Startup.Auth.cs
文件。
所以我的问题是:
- 我真的需要手动输入
ApplicationRoleManager
类吗? - 如何使
seed
方法有效?
UPDATE
我已将Seed
方法更改为:
protected override void Seed(ApplicationDbContext context) { var userManager = HttpContext.Current.GetOwinContext().GetUserManager(); //since there is no ApplicationRoleManager (why is that?) this is how i create it var roleManager = new RoleManager(new RoleStore(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);
应用程序挂起,没有例外或任何消息……
使用迁移时,您可以使用内置初始化程序和Seed
方法:
Database.SetInitializer(new MigrateDatabaseToLatestVersion());
在APPLICATION.Migrations.Configuration
(这是由Enable-Migrations
命令创建的):
protected override void Seed(ApplicationDbContext context) { // seed logic }
作为角色管理器,您还可以使用RoleManager
基础实现。
在这种情况下,我也对悬挂应用程序感到有些困惑。 这个问题可以通过这种方式解决
var userManager = new UserManager(new UserStore(db)); var roleManager = new RoleManager(new RoleStore (db));
对于任何使用带有Integer外键的ApplicationUser的人来说,代码是这样的:
var userManager = new ApplicationUserManager(new ApplicationUserStore(context)); var roleManager = new ApplicationRoleManager(new ApplicationRoleStore(context));
这适用于默认的MVC 5项目。
var manager = new ApplicationUserManager(new UserStore(context));
发布的解决方案似乎并未解决在userManager.FindByName(name)
调用时userManager.FindByName(name)
的应用程序问题。 我遇到了同样的问题。 它几个小时前就在我当地工作了。 我发布到Azure,它开始挂起。 当我再次测试我的本地时,它突然开始挂在那一步。 没有错误返回且没有超时(至少等待10-15分钟后)。 有没有人有任何提示来解决Yoav的终极问题?
我有一些其他非常简单的种子进程在添加角色之前运行,并且db.Foo.AddOrUpdate(foo)
调用正在运行而没有错误,但实际上没有将任何内容保存到数据库。
我只是花了一个非常不愉快的半天来处理这件事。 我终于设法得到该死的东西:
public static void InitializeIdentityForEF(ApplicationDbContext context) { context.Configuration.LazyLoadingEnabled = true; //var userManager = HttpContext.Current // .GetOwinContext().GetUserManager(); //var roleManager = HttpContext.Current // .GetOwinContext().Get(); var roleStore = new RoleStore(context); var roleManager = new RoleManager(roleStore); var userStore = new UserStore(context); var userManager = new UserManager(userStore); ...
这是一个非常漫长的一天的结束,我怀疑有人会告诉我为什么我不应该这样做。 然而,我的Seed方法的其余部分使用非异步方法(FindByName / Create)进行精美的激发。
goobering先生,你的挣扎帮助我解决了这个问题,但我不得不这样做有点不同。
上述就是C#学习教程:了解MVC-5身份分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
context.Configuration.LazyLoadingEnabled = true; //var userManager = HttpContext.Current.GetOwinContext().GetUserManager(); //var roleManager = HttpContext.Current.GetOwinContext().Get(); const string name = "admin@example.com"; const string password = "Admin@123456"; const string roleName = "Admin"; ***var userManager = new ApplicationUserManager(new UserStore(context)); var roleManager = new ApplicationRoleManager(new RoleStore(context));*** //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); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/961265.html