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&lt;RoleManager&lt;IdentityRole&gt;&gt;(),因为services.AddIdentity()已经为你添加了角色管理器。

您的问题很可能是由泛型类型不匹配引起的:当您使用IdentityRole&lt;int&gt; 调用services.AddIdentity() 时,您尝试使用IdentityRole 解析RoleManager,这相当于IdentityRole&lt;string&gt; (string是 ASP.NET Core Identity 中的默认键类型)。

更新您的 Configure 方法以采用 RoleManager&lt;IdentityRole&lt;int&gt;&gt; 参数,它应该可以工作。

【讨论】:

这是一个很好的修复,非常有帮助。我还建议从 DatabaseInitializer 调用 SeedRoles,以便 CreateUsers 和角色从启动时异步类似于code public async Task SeedAsync() await CreateUsersAsync();等待 RolesData.SeedRoles(_roleManager); 我有一个函数,可以在其中播种一些数据,包括角色。当我获取 RoleManager 服务时,我做了 serviceProvider.GetRequiredService>();它应该是 serviceProvider.GetRequiredService>>();具有通用整数特异性【参考方案3】:

这是我的解决方案种子用户和角色 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&lt;Guid&gt; 更改为IdentityRole,效果非常棒。

以上是关于ASP.NET Core 标识:角色管理器没有服务的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core 2.0 项目实战NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架

ASP .NET Core 身份登录管理器

ASP.NET Core Identity 3.1:UserManager.RemoveFromRoleAsync 总是返回 UserNotInRole

ASP.NET MVC 异常“角色管理器功能尚未启用”

asp.net core 拦击器制作的权限管理系统DEMO

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 17. 基于Claim和Policy的授权 上