ASP.NET Core 标识:角色管理器没有服务
Posted
技术标签:
【中文标题】ASP.NET Core 标识:角色管理器没有服务【英文标题】:ASP.NET Core Identity: No service for role manager 【发布时间】:2017-01-02 11:19:08 【问题描述】:我有一个使用 Identity 的 ASP.NET Core 应用程序。它可以工作,但是当我尝试向数据库添加自定义角色时,我遇到了问题。
在 Startup ConfigureServices
我已将身份和角色管理器添加为这样的范围服务:
services.AddIdentity<Entities.DB.User, IdentityRole<int>>()
.AddEntityFrameworkStores<MyDBContext, int>();
services.AddScoped<RoleManager<IdentityRole>>();
在 Startup 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.RoleManager”时无法解析“Microsoft.AspNetCore.Identity.IRoleStore`1[Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole]”类型的服务
我做错了什么?我的直觉说我将 RoleManager 添加为服务的方式有问题。
PS:我在创建项目时使用“无身份验证”从头开始学习身份。
【问题讨论】:
我建议使用个人用户帐户创建另一个项目,以便您可以比较使用包含身份的模板时为您设置的内容 添加了“个人用户帐户”的全新项目不包含任何设置角色的代码。 不,它没有,但它可能有一些代码连接你没有正确连接的依赖项 在不相关的说明中,您应该避免在Configure
方法中注入像RoleManager
这样的作用域依赖项,因为它会阻止底层DbContext
被正确处理。相反,请考虑使用IServiceScopeFactory.CreateScope()
创建一个服务范围,该范围将在您的SeedRoles
方法返回时释放(您可以查看github.com/openiddict/openiddict-samples/blob/master/samples/… 的示例)
【参考方案1】:
我遇到了这个问题
“Microsoft.AspNetCore.Identity.RoleManager`”类型没有服务
这个页面是谷歌上的第一个结果。它没有回答我的问题,所以我想我会将我的解决方案放在这里,以供其他可能遇到此问题的人使用。
ASP.NET Core 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(底部)
【讨论】:
那么 UserManager 呢? 我正在为一家公司构建一个内部应用程序,所以我使用 Active Directory 来授权用户并获取角色【参考方案2】:我做错了什么?我的直觉说我将 RoleManager 添加为服务的方式有问题。
注册部分其实没问题,不过你应该删除services.AddScoped<RoleManager<IdentityRole>>()
,因为services.AddIdentity()
已经为你添加了角色管理器。
您的问题很可能是由泛型类型不匹配引起的:当您使用IdentityRole<int>
调用services.AddIdentity()
时,您尝试使用IdentityRole
解析RoleManager
,这相当于IdentityRole<string>
(string
是 ASP.NET Core Identity 中的默认键类型)。
更新您的 Configure
方法以采用 RoleManager<IdentityRole<int>>
参数,它应该可以工作。
【讨论】:
这是一个很好的修复,非常有帮助。我还建议从 DatabaseInitializer 调用 SeedRoles,以便 CreateUsers 和角色从启动时异步类似于code
public async Task SeedAsync() await CreateUsersAsync();等待 RolesData.SeedRoles(_roleManager);
我有一个函数,可以在其中播种一些数据,包括角色。当我获取 RoleManager 服务时,我做了 serviceProvider.GetRequiredService这是我的解决方案种子用户和角色 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();
【讨论】:
这种方法对我产生了错误。我自始至终将IdentityRole<Guid>
更改为IdentityRole
,效果非常棒。以上是关于ASP.NET Core 标识:角色管理器没有服务的主要内容,如果未能解决你的问题,请参考以下文章
Asp.Net Core 2.0 项目实战NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架
ASP.NET Core Identity 3.1:UserManager.RemoveFromRoleAsync 总是返回 UserNotInRole
ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 17. 基于Claim和Policy的授权 上