ASP 标识 2.0 和 ASP.NET MVC 项目结构

本文关键字:ASP MVC 项目 结构 NET 标识 | 更新日期: 2023-09-27 18:30:22

我是ASP.NET MVC5的初学者。

我的项目解决方案具有 MVC5 Pro 中所述 ASP.NET 结构:

Solution
 -Project.Domain    --- C# Class Library
 -Project.WebUI     --- Empty ASP.Net MVC Project Template
 -Project.UnitTests

我想在其中使用ASP Identity 2.0

在Project.Domain中,我有Concrete(上下文,它们的初始值设定项)和Entities(数据模型)折叠器。

我按照此处所述安装了Identity 2.0 Samples

我将IdentityModels.cs文件分成ApplicationDbContext.csApplicationUser.cs,并分别将它们放入ConcreteEntities折叠器中。

同样在折叠器Concrete我有EFDbContext.cs - 与ApplicationDbContext上下文分开(它们使用相同的数据库连接)。

我想将AppicationDbInitializer类(来自 Project.WebUI'App_Start'IdentityConfig.cs )存储在 Project.DomainApplicationDbContext,因为它包含设置ApplicationDbInitializer静态构造函数,但后来发现 Project.DomainProject.WebUI 具有循环依赖性,所以我决定不移动它并从 Project.WebUI Global.asax.cs设置数据库初始值设定项。

然后问题开始了。由于某些原因,方法 ApplicationDbInitializer.Seed 不起作用,并且未创建role "Admin"。然后我决定尝试启用迁移。我在 Project.Domain 中启用了迁移(如此处所述),为了实现Seed我需要从IdentityConfig.cs (ApplicationUserManager and ApplicationRoleManager)访问来自Project.WebUI的类。不幸的是,它将再次产生循环依赖。

我的问题是该怎么做:如何正确地划分项目解决方案并找到Identity 2.0文件?为什么Seed方法从ApplicationDbInitilizer不起作用?

ASP 标识 2.0 和 ASP.NET MVC 项目结构

我想我们正在尝试做完全相同的事情Sleepy,我和你在同一条船上。 我会用我尝试过的东西填充你。

首先,您可以通过将 ApplicationDbInitializer 移动到 Application_Start 方法并调用 Database.SetInitializer 来修复循环依赖关系。

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

这使您可以将 ApplicationDbContext 和 ApplicationUser 保留在域中,同时将 ApplicationDbInitializer 保留在 WebUI 项目中。

其次,我读过之前的一篇文章,说不要使用GetOwinContext方法来获取userManager和roleManager,但不确定这有多好。 但至少让我更进一步。

将标识 2.0 函数移动到存储库类

    public static void InitializeIdentityForEf(ApplicationDbContext context) {
        // var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
        // var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
        // Since we needed to move this class into the Domain namespace, we have to do the Owin differently
        var roleStore = new RoleStore<IdentityRole>(context);
        var roleManager = new RoleManager<IdentityRole>(roleStore);
        var userStore = new UserStore<ApplicationUser>(context);
        var userManager = new UserManager<ApplicationUser>(userStore);
当我

执行"更新数据库"时,种子没有填充,但是当我运行网站并尝试注册用户时,它确实会尝试运行。 但是我收到一个错误

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

在这一行

var result = await UserManager.CreateAsync(user, model.Password);