ASP.NET Core Identity: нет службы для менеджера ролей
У меня есть приложение ASP.NET Core, которое использует Identity. Это работает, но когда я пытаюсь добавить пользовательские роли в базу данных, у меня возникают проблемы.
В запуске ConfigureServices
Я добавил Identity и диспетчер ролей как сервис с областью видимости, например так:
services.AddIdentity<Entities.DB.User, IdentityRole<int>>()
.AddEntityFrameworkStores<MyDBContext, int>();
services.AddScoped<RoleManager<IdentityRole>>();
и в автозагрузке Configure
Я внедряю RoleManager и передаю его в свой пользовательский класс RolesData
:
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory,
RoleManager<IdentityRole> roleManager
)
{
app.UseIdentity();
RolesData.SeedRoles(roleManager).Wait();
app.UseMvc();
Это RolesData
учебный класс:
public static class RolesData
{
private static readonly string[] roles = new[] {
"role1",
"role2",
"role3"
};
public static async Task SeedRoles(RoleManager<IdentityRole> roleManager)
{
foreach (var role in roles)
{
if (!await roleManager.RoleExistsAsync(role))
{
var create = await roleManager.CreateAsync(new IdentityRole(role));
if (!create.Succeeded)
{
throw new Exception("Failed to create role");
}
}
}
}
}
Приложение собирается без ошибок, но при попытке доступа к нему я получаю следующую ошибку:
Не удалось разрешить службу для типа "Microsoft.AspNetCore.Identity.IRoleStore`1[Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole]" при попытке активировать "Microsoft.AspNetCore.Identity.RoleManager".
Что я делаю неправильно? Моя интуиция говорит, что что-то не так с тем, как я добавляю RoleManager в качестве сервиса.
PS: я использовал "Нет аутентификации" при создании проекта, чтобы узнать идентичность с нуля.
1 ответ
Что я делаю неправильно? Моя интуиция говорит, что что-то не так с тем, как я добавляю RoleManager в качестве сервиса.
Часть регистрации на самом деле хорошо, но вы должны удалить services.AddScoped<RoleManager<IdentityRole>>()
, поскольку менеджер ролей уже добавлен для вас services.AddIdentity()
,
Ваша проблема, скорее всего, вызвана общим несоответствием типов: пока вы звоните services.AddIdentity()
с IdentityRole<int>
пытаешься разрешить RoleManager
с IdentityRole
, который является эквивалентом IdentityRole<string>
(string
являющийся типом ключа по умолчанию в ASP.NET Core Identity).
Обновите свой Configure
способ взять RoleManager<IdentityRole<int>>
параметр, и он должен работать.
У меня была эта проблема
Нет службы для типа 'Microsoft.AspNetCore.Identity.RoleManager`
И эта страница была первым результатом в Google. Он не ответил на мой вопрос, поэтому я решил поставить свое решение здесь, для всех, у кого может быть эта проблема.
ASP.NET Core 2.2
Для меня отсутствующей строкой была .AddRoles() в файле Startup.cs.
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
Надеюсь, это поможет кому-то
Источник: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-2.2 (внизу)
Это моё решение, затравленное пользователем и ролью ASP.NET Core 2.2
Startup.cs
services.AddDefaultIdentity<ApplicationUser>()
.AddRoles<IdentityRole<Guid>>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
...
...
SeedData.Initialize(app.ApplicationServices);
)
SeedData.cs
public static void Initialize(IServiceProvider serviceProvider)
{
using (var scope = serviceProvider.CreateScope())
{
var provider = scope.ServiceProvider;
var context = provider.GetRequiredService<ApplicationDbContext>();
var userManager = provider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManager = provider.GetRequiredService<RoleManager<IdentityRole<Guid>>>();
// automigration
context.Database.Migrate();
InstallUsers(userManager, roleManager);
}
}
private static void InstallUsers(UserManager<ApplicationUser> userManager, RoleManager<IdentityRole<Guid>> roleManager)
{
const string USERNAME = "admin@mysite.com";
const string PASSWORD = "123456ABCD";
const string ROLENAME = "Admin";
var roleExist = roleManager.RoleExistsAsync(ROLENAME).Result;
if (!roleExist)
{
//create the roles and seed them to the database
roleManager.CreateAsync(new IdentityRole<Guid>(ROLENAME)).GetAwaiter().GetResult();
}
var user = userManager.FindByNameAsync(USERNAME).Result;
if (user == null)
{
var serviceUser = new ApplicationUser
{
UserName = USERNAME,
Email = USERNAME
};
var createPowerUser = userManager.CreateAsync(serviceUser, PASSWORD).Result;
if (createPowerUser.Succeeded)
{
var confirmationToken = userManager.GenerateEmailConfirmationTokenAsync(serviceUser).Result;
var result = userManager.ConfirmEmailAsync(serviceUser, confirmationToken).Result;
//here we tie the new user to the role
userManager.AddToRoleAsync(serviceUser, ROLENAME).GetAwaiter().GetResult();
}
}
}