c# - ASP.NET Core 2.1 角色管理器注册
问题描述
在我的种子代码中,我创建了用户和角色,并且错误似乎是每当我通过启动运行它时,我似乎得到了
“没有
Microsoft.AspNetCore.Identity.RoleManager'1[Microsoft.AspNetCore.Identity.IdentityRole]
注册类型的服务。
编辑*** 我认为问题在于 identityhostingstartup 中的代码没有被执行,这是由脚手架身份创建的。
种子数据库
public static void CreateRolesAndUsers(IServiceProvider serviceProvider)
{
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var userManager = serviceProvider.GetRequiredService<UserManager<AppUser>>();
var context = serviceProvider.GetService<AuthContext>();
var configuration = serviceProvider.GetService<IConfiguration>();
//context.Database.EnsureCreated();
context.Database.Migrate();
Task<IdentityResult> roleResult;
string email = configuration["Admin:Email"];
//Check that there is an Administrator role and create if not
Task<bool> hasAdminRole = roleManager.RoleExistsAsync(Roles.ADMIN);
hasAdminRole.Wait();
if (!hasAdminRole.Result)
{
roleResult = roleManager.CreateAsync(new IdentityRole(Roles.ADMIN));
roleResult.Wait();
}
//Check if the admin user exists and create it if not
//Add to the Administrator role
Task<AppUser> testUser = userManager.FindByEmailAsync(email);
testUser.Wait();
if (testUser.Result == null)
{
CreateAdminUser(userManager, email, configuration["Admin:Password"]);
}
else if (configuration.GetValue<bool>("Admin:Reset") == true)
{
userManager.DeleteAsync(testUser.Result);
CreateAdminUser(userManager, email, configuration["Admin:Password"]);
}
}
private static void CreateAdminUser(UserManager<AppUser> userManager, string email, string password)
{
AppUser user = new AppUser
{
Email = email,
UserName = email
};
Task<IdentityResult> newUser = userManager.CreateAsync(user, password);
newUser.Wait();
if (newUser.Result.Succeeded)
{
Task<IdentityResult> newUserRole = userManager.AddToRoleAsync(user, Roles.ADMIN);
newUserRole.Wait();
}
}
IdentityHostingStartup.cs
enter [assembly: HostingStartup(typeof(WebApp.Areas.Identity.IdentityHostingStartup))]
namespace WebApp.Areas.Identity
{
public class IdentityHostingStartup : IHostingStartup
{
public void Configure(IWebHostBuilder builder)
{
builder.ConfigureServices((context, services) => {
});
}
}
}
启动.cs
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
我得到的完整错误信息是这样的
System.InvalidOperationException
HResult=0x80131509
Message=No service for type 'Microsoft.AspNetCore.Identity.RoleManager`1[Microsoft.AspNetCore.Identity.IdentityRole]' has been registered.
Source=Microsoft.Extensions.DependencyInjection.Abstractions
StackTrace:
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions. GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions. GetRequiredService[T](IServiceProvider provider)
at b.Data.SeedAuth.CreateRolesAndUsers(IServiceProvider serviceProvider) in C:\Users\\source\repos\b\b\Data\SeedAuth.cs:line 17
at b.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider) in C:\Users\\source\repos\b\b\Startup.cs:line 65
解决方案
您尚未在 DI 容器中注册角色服务。这一行:
services.AddDefaultIdentity<AppUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
需要通过使用AddRoles
方法更改以包含它们。假设您使用的是默认IdentityRole
类:
services.AddDefaultIdentity<AppUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
推荐阅读
- javascript - 如何以角度构建垂直滑动选择器
- http - 飞利浦 Hue https 连接问题
- node.js - 如何在adonis5中创建路径和查询验证
- r - 如果第一列是第二个数据框列的子集,则将数据框列的元素转换为另一个数据框列的元素
- python - 无法从另一个 docker 容器中的烧瓶应用程序对驻留在 docker 容器中的 django 应用程序进行“获取”调用
- mysql - 如何在 MySQL 中为每个类别创建一个 SQL 窗口函数列?
- c# - C#:工作簿的关闭方法不适用于在 OneDrive 上打开的工作簿
- firebase - 如何使用 Firedart 插件将 Desktop Flutter App 连接到 Firestore
- netlify - Strapi 和 Netlify 构建错误 - 有效负载超过 140kb 的限制
- javascript - 如何从 PHP 脚本指向带有 HMR 的 webpack 开发服务器?