web-dev-qa-db-ja.com

ASP.NET Core Identity:ロールマネージャーのサービスなし

Identityを使用するASP.NET Coreアプリがあります。それは機能しますが、データベースにカスタムロールを追加しようとすると、問題が発生します。

Startup ConfigureServicesで、Identityとロールマネージャーをスコープサービスとして次のように追加しました。

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:プロジェクトを作成するときに「認証なし」を使用して、ゼロからIDを学習しました。

13
Glenn Utter

私は何を間違えていますか?私の直感では、RoleManagerをサービスとして追加する方法に問題があると言います。

登録部分は実際には問題ありません。services.AddScoped<RoleManager<IdentityRole>>()によってロールマネージャーが既に追加されているため、services.AddIdentity()を削除する必要があります。

ほとんどの場合、一般的な型の不一致が原因です。IdentityRole<int>services.AddIdentity()を呼び出しているときに、RoleManagerIdentityRoleで解決しようとします。これはIdentityRole<string>stringは、ASP.NET Core Identityのデフォルトのキータイプです。

Configureメソッドを更新して、RoleManager<IdentityRole<int>>パラメーターを取得します。これは機能するはずです。

15
Pinpoint

私はこの問題を抱えていました

「Microsoft.AspNetCore.Identity.RoleManager」タイプのサービスはありません

そして、このページはGoogleでの最初の結果でした。それは私の質問に答えなかったので、この問題を抱えているかもしれない他の人のために、ここに私の解決策を置くと思いました。

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 (下部)

6
Dave ت Maher

この私のソリューションシードユーザーとロール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 = "[email protected]";
        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();
            }
        }
    }
0
dev-siberia