7

アイデンティティを使用するASP.NETコアアプリケーションがあります。それは動作しますが、データベースにカスタムロールを追加しようとすると、問題が発生します。ASP.NETコアID:ロールマネージャのサービスがありません

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(); 
私はこのようなスコープサービスとしてのアイデンティティとロールマネージャーを追加したスタートアップ ConfigureServices

これは、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"); 

       } 
      } 

     } 

    } 

} 

アプリがエラーなしで構築し、それをアクセスしようとしたとき、私は次のエラーを取得:

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:スクラッチからアイデンティティを学ぶためのプロジェクトを作成するときに「認証なし」を使用しました。

+0

個別のユーザーアカウントを使用して別のプロジェクトを作成して、IDを含むテンプレートを使用するときの設定と比較できるようにすることをお勧めします。 –

+0

「個別のユーザーアカウント」を追加した新しいプロジェクトには、役割。 –

+0

いいえ、それはありませんが、正しく接続されていない依存関係を結ぶコードを持っている可能性があります –

答えて

7

What am I doing wrong? My gut says there's something wrong with how I add the RoleManager as a service.

登録部は、ロールマネージャがすでにservices.AddIdentity()によって自動的に追加されたとして、あなたが、services.AddScoped<RoleManager<IdentityRole>>()を削除する必要があります「カントー、実際は結構です。

あなたの問題は、最も可能性の高いジェネリック型の不一致が原因です:あなたはIdentityRole<int>services.AddIdentity()を呼び出している間、あなたはASP.NETコアアイデンティティにおけるデフォルトのキータイプであることIdentityRole<string>の同等であるIdentityRole、とRoleManagerstringを解決しようとします)。

Configureメソッドを更新してRoleManager<IdentityRole<int>>パラメータを使用すると、正常に動作するはずです。

+0

はい!ありがとうございます!今それは正常に動作します。 –

+0

これはすばらしい修正であり、非常に役に立ちました。私はまた、CreateInterializerからSeedRolesを呼び出すことを勧めます。これは、CreateUsersとロールの非同期を 'code 'のようなスタートアップから行うようにするためです。public async Task SeedAsync(){CreateUsersAsync();} RolesData.SeedRoles(_roleManager);}を待ちます。 – RussHooker

関連する問題