Entity Framework(Dapperを使用)を使用せずに、既存のデータベースとテーブルを使用して認証と承認を構成しようとしています。
Dapperを正しく構成したので、SignInManagerとUserManagerを接続してDapper経由でデータベースを呼び出しようとしていますが、その前に、カスタムロールストアでいくつかのエラーが発生しています。
これは、ウェブサイトの[登録]ボタンをクリックしたときに受け取るエラーです(これは、事前に定義されたアカウントなどがすべて含まれた単純なプロジェクトです)
InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNet.Identity.IRoleStore`1[TestAsyncWebsite.Configuration.WrestleStatRole]' while attempting to activate 'Microsoft.AspNet.Identity.RoleManager`1[TestAsyncWebsite.Configuration.WrestleStatRole]'
ここでは、カスタムユーザー、ロール、ユーザーストア、ロールストア、ユーザーマネージャー、ロールマネージャーを構成する方法を示します。
public class WrestleStatUser : ApplicationUser
{
public WrestleStatUser() : base()
{
}
}
public class WrestleStatRole : IdentityRole
{
}
public class WrestleStatUserStore : IUserStore<WrestleStatUser>
{
// all methods implemented
}
public class WrestleStatRoleStore : IRoleStore<WrestleStatRole>
{
// all methods implemented
}
public class WrestleStatUserManager : UserManager<WrestleStatUser>
{
public WrestleStatUserManager(IUserStore<WrestleStatUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<WrestleStatUser> passwordHasher, IEnumerable<IUserValidator<WrestleStatUser>> userValidators, IEnumerable<IPasswordValidator<WrestleStatUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IEnumerable<IUserTokenProvider<WrestleStatUser>> tokenProviders, ILogger<UserManager<WrestleStatUser>> logger, IHttpContextAccessor contextAccessor)
: base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, tokenProviders, logger, contextAccessor)
{
}
}
public class WrestleStatRoleManager : RoleManager<WrestleStatRole>
{
public WrestleStatRoleManager(IRoleStore<WrestleStatRole> store, IEnumerable<IRoleValidator<WrestleStatRole>> roleValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, ILogger<RoleManager<WrestleStatRole>> logger, IHttpContextAccessor contextAccessor) : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor)
{
}
}
そして、これが私のstartup.csです:
services.AddIdentity<WrestleStatUser, WrestleStatRole>()
.AddUserStore<WrestleStatUserStore>()
.AddUserManager<WrestleStatUserManager>()
//.AddRoleStore<RoleStore>()
.AddRoleManager<WrestleStatRoleManager>()
.AddDefaultTokenProviders();
ここで何が欠けていますか?エラーはRoleManagerについて何かを言っています、私はすでにカスタムRoleManagerを定義しています...
私が目にする1つの問題は、WrestleStatRoleが IdentityRole から継承することです。これは、Identityの一部のように聞こえるかもしれませんが、実際にはEntityFramework Identity実装の一部です。
独自の役割クラスが必要であり、EF実装のクラスを使用しないでください。
同様に、WrestleStatUserで継承したApplicationUserは、Webアプリプロジェクトモデルフォルダーにありますが、IdentityのEntityFramework実装の一部である IdentityUser から継承しないようにしてください。
Entity Frameworkを使用しない場合は、IUserStoreとIRoleStoreを実装し、それらをdiサービスに登録する必要があります
services.AddScoped<IUserStore<WrestleStatUser>, UserStore<WrestleStatUser>>();
services.AddScoped<IRoleStore<WrestleStatRole>, RoleStore<WrestleStatRole>>();
また、前述のように、ユーザークラスとロールクラスはEF実装から継承するべきではありません。実際には、これらのストアを実装して機能している限り、何も継承する必要はありません。
ユーザーストアとロールストアを実装する場合は、組み込みのUserManagerを使用できます。他に理由がある場合を除き、自分で実装する必要はありません。
サンプルコードが必要な場合は、私の cloudscribe project を参照してください。エンティティフレームワークを使用しないカスタムマルチテナントID実装を実装しました。実際に、プラグイン可能な複数のデータレイヤーをサポートしています。EFはその1つですが、IDビットから切り離されており、Microsoft.AspNetCore.Identity.EntityFrameworkCore名前空間から何も使用していません。