ASP.NET 核心标识:没有角色管理器服务
ASP.NET Core Identity: No service for role manager
我有一个使用 Identity 的 ASP.NET 核心应用程序。它有效,但是当我尝试向数据库添加自定义角色时,我 运行 遇到了问题。
在 Startup ConfigureServices
中,我将身份和角色管理器添加为范围服务,如下所示:
services.AddIdentity<Entities.DB.User, IdentityRole<int>>()
.AddEntityFrameworkStores<MyDBContext, int>();
services.AddScoped<RoleManager<IdentityRole>>();
并在 Startup Configure
中注入 RoleManager 并将其传递给我的自定义 class RolesData
:
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory,
RoleManager<IdentityRole> roleManager
)
{
app.UseIdentity();
RolesData.SeedRoles(roleManager).Wait();
app.UseMvc();
这是RolesData
class:
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");
}
}
}
}
}
应用程序构建没有错误,但在尝试访问它时出现以下错误:
Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IRoleStore`1[Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole]' while attempting to activate 'Microsoft.AspNetCore.Identity.RoleManager
我做错了什么?我的直觉告诉我,我将 RoleManager 添加为服务的方式有问题。
PS:我在创建项目的时候用过"No authentication"从零开始学习Identity。
What am I doing wrong? My gut says there's something wrong with how I add the RoleManager as a service.
注册部分实际上没问题,但您应该删除 services.AddScoped<RoleManager<IdentityRole>>()
,因为 services.AddIdentity()
已经为您添加了角色管理器。
您的问题很可能是由泛型类型不匹配引起的:当您用 IdentityRole<int>
调用 services.AddIdentity()
时,您尝试用 IdentityRole
解析 RoleManager
,这是相当于 IdentityRole<string>
(string
是 ASP.NET Core Identity 中的默认密钥类型)。
更新您的 Configure
方法以获取 RoleManager<IdentityRole<int>>
参数,它应该可以工作。
这是我的解决方案种子用户和角色 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();
}
}
}
我遇到了这个问题
No service for type 'Microsoft.AspNetCore.Identity.RoleManager`
并且此页面是 Google 上的第一个结果。它没有回答我的问题,所以我想我会把我的解决方案放在这里,以供其他可能遇到此问题的人使用。
ASP.NET 核心 2.2
我缺少的行是 Startup.cs 文件中的 .AddRoles()。
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(底部)
我有一个使用 Identity 的 ASP.NET 核心应用程序。它有效,但是当我尝试向数据库添加自定义角色时,我 运行 遇到了问题。
在 Startup ConfigureServices
中,我将身份和角色管理器添加为范围服务,如下所示:
services.AddIdentity<Entities.DB.User, IdentityRole<int>>()
.AddEntityFrameworkStores<MyDBContext, int>();
services.AddScoped<RoleManager<IdentityRole>>();
并在 Startup Configure
中注入 RoleManager 并将其传递给我的自定义 class RolesData
:
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory,
RoleManager<IdentityRole> roleManager
)
{
app.UseIdentity();
RolesData.SeedRoles(roleManager).Wait();
app.UseMvc();
这是RolesData
class:
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");
}
}
}
}
}
应用程序构建没有错误,但在尝试访问它时出现以下错误:
Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IRoleStore`1[Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole]' while attempting to activate 'Microsoft.AspNetCore.Identity.RoleManager
我做错了什么?我的直觉告诉我,我将 RoleManager 添加为服务的方式有问题。
PS:我在创建项目的时候用过"No authentication"从零开始学习Identity。
What am I doing wrong? My gut says there's something wrong with how I add the RoleManager as a service.
注册部分实际上没问题,但您应该删除 services.AddScoped<RoleManager<IdentityRole>>()
,因为 services.AddIdentity()
已经为您添加了角色管理器。
您的问题很可能是由泛型类型不匹配引起的:当您用 IdentityRole<int>
调用 services.AddIdentity()
时,您尝试用 IdentityRole
解析 RoleManager
,这是相当于 IdentityRole<string>
(string
是 ASP.NET Core Identity 中的默认密钥类型)。
更新您的 Configure
方法以获取 RoleManager<IdentityRole<int>>
参数,它应该可以工作。
这是我的解决方案种子用户和角色 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();
}
}
}
我遇到了这个问题
No service for type 'Microsoft.AspNetCore.Identity.RoleManager`
并且此页面是 Google 上的第一个结果。它没有回答我的问题,所以我想我会把我的解决方案放在这里,以供其他可能遇到此问题的人使用。
ASP.NET 核心 2.2
我缺少的行是 Startup.cs 文件中的 .AddRoles()。
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(底部)