【问题标题】:ASP.NET Core 6 MVC + views: exception when switching from AddDefaultIdentity to AddIdentityASP.NET Core 6 MVC + 视图:从 AddDefaultIdentity 切换到 AddIdentity 时出现异常
【发布时间】:2022-10-24 15:06:50
【问题描述】:

我打开了一个基于 ASP.NET Core MVC 和视图模板(不是 Razor 页面)的测试项目(.NET 6、VS2022),并激活了个人用户帐户。

Program.cs 看起来像这样(来自模板):

builder.Services.AddDefaultIdentity<IdentityUser>(options ...

builder.Services.AddControllersWithViews();

...
app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

到目前为止,一切都很好。

现在我添加了一些示例代码来播种用户数据库,它需要访问RoleManager

var roleManager = services.GetRequiredService<RoleManager<IdentityRole>>();`

但是,这会引发异常

Microsoft.AspNetCore.Identity.RoleManager`1[Microsoft.AspNetCore.Identity.IdentityRole]' 类型没有服务

这可以通过将AddDefaultIdentity() 更改为AddIdentity() 来修复(感谢 Stackoverflow),AddIdentity() 引入了IdentityRole

builder.Services.AddIdentity<IdentityUser, IdentityRole>(options ...

但是,现在我得到了一个例外

app.MapRazorPages();

System.InvalidOperationException: '无法找到所需的服务。请通过在应用程序启动代码中对“ConfigureServices(...)”的调用中调用“IServiceCollection.AddRazorPages”来添加所有必需的服务。

需要配置哪些服务以及如何配置?

当我删除app.MapRazorPages(); 时,用户管理页面(登录、用户注册)不再起作用(404 错误)。

当我在上面添加 builder.Service.AddRazorPages() 时,路由也被破坏:缺少到 "/account/login" 的路由,可能是因为 Razor 页面的组织方式与 MVC 控制器有些不同。显然,我不想要 Razor 页面,只需要几个视图中的 Razor 逻辑,并且基本上是 MVC 架构。

老实说,我有点困惑,因为官方文档没有多大帮助。

【问题讨论】:

  • 我试图在我身边重现您的问题,但我没有找到指导我访问 RoleManager 的官方文档。然后我尝试搜索错误信息,找到了这个配置services.AddDefaultIdentity&lt;User&gt;().AddRoles&lt;IdentityRole&gt;()。您能否告诉我您按照哪个教程访问 RoleManager ?
  • 嗨,我在生活 REST 项目中看到了这一点(使用 builder.Services.AddControllers();(因此,没有视图)。本教程由 Nate Barbettini 编写,第 90 页:link 这是关于 .NET5,但命令(和生活项目)也应该与 .NET6 一起使用。现在添加您的建议会抛出 var app = builder.Build();(我做了:builder.Services.AddDefaultIdentity&lt;IdentityUser&gt;(options =&gt; options.SignIn.RequireConfirmedAccount = true).AddRoles&lt;IdentityRole&gt;() .AddEntityFrameworkStores&lt;ApplicationDbContext&gt;();

标签: razor asp.net-core-mvc asp.net-core-6.0


【解决方案1】:

按照您的文档,我发现您所做的是添加初始化以在数据库中创建数据。所以我创建了一个新的 .net 6 MVC 应用程序并集成了default authentication。创建项目时使用Individual User Accounts 选择身份验证类型字段,然后在包管理器控制台窗口中运行Update-Database 命令。现在我有一个带有默认 asp.net 核心身份验证的空 .net 6 MVC 项目。

接下来,我按照文档,在根文件夹中创建了一个SeedData.cs文件:

using Microsoft.AspNetCore.Identity;

namespace WebAppDefIdentity
{
    public static class SeedData
    {
        //public const string AdministratorRole = "Administrator";

        public static async Task InitializeAsync(IServiceProvider services) {
            var roleManager = services.GetRequiredService<RoleManager<IdentityRole>>();
            await EnsureRolesAsync(roleManager);
        }

        private static async Task EnsureRolesAsync(RoleManager<IdentityRole> roleManager)
        {
            var alreadyExists = await roleManager.RoleExistsAsync("Administrator");
        }

    }
}

并且该文件是面向 .net 5 的项目,因此需要稍作改动。在Program.cs 文件中,添加以下代码。

using (var scope = app.Services.CreateScope())
{
    var aa = scope.ServiceProvider;
    await SeedData.InitializeAsync(aa);
}

然后我重现你的第一个异常

为了解决这个异常,我在Program.cs 中更改了代码.AddRoles&lt;IdentityRole&gt;()

那么也不例外。

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 2019-02-24
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2020-02-26
    相关资源
    最近更新 更多