ASP.NET Core 6 MVC切换AddDefaultIdentity至AddIdentity后遇异常
解决方案
1. 修正Identity服务注册
在Program.cs的服务配置段,将原AddDefaultIdentity<IdentityUser>替换为以下代码,补充身份UI所需的核心服务(这是AddDefaultIdentity默认包含但AddIdentity缺失的关键部分):
builder.Services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders() .AddDefaultUI(); // 关键:添加默认身份页面的UI支持
2. 调整中间件路由顺序
在Program.cs的中间件配置段,先保留MVC默认路由,再添加Razor Pages路由映射,确保MVC路由优先处理,同时身份页面能被正确识别:
// 保留MVC核心路由(适配你的架构需求) app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); // 仅映射身份系统相关的Razor Pages页面 app.MapRazorPages();
3. 角色种子数据初始化示例
如果需要初始化角色数据,可在app.Run();之前添加以下逻辑(依赖已注册的RoleManager):
using (var scope = app.Services.CreateScope()) { var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>(); var targetRoles = new[] { "Admin", "Editor", "User" }; foreach (var roleName in targetRoles) { if (!await roleManager.RoleExistsAsync(roleName)) { await roleManager.CreateAsync(new IdentityRole(roleName)); } } }
问题根源说明
- 替换
AddDefaultIdentity为AddIdentity后,缺失了AddDefaultUI(),导致身份页面的Razor Pages服务未注册,因此调用MapRazorPages()会抛出服务缺失异常。 - 直接添加
AddRazorPages()会全局启用Razor Pages路由,其优先级会覆盖MVC的/Account/Login等路由,导致MVC路由失效。 AddDefaultUI()仅注册身份系统所需的Razor Pages组件,不会干扰MVC的正常路由逻辑。
内容的提问来源于stack exchange,提问作者Ingmar
相关产品推荐
相关产品推荐

