web-dev-qa-db-ja.com

ストアはIUserRoleStore <TUser> ASP.NET Core 2.1 Identityを実装しません

ASP.NET Core 2.1 Identityを使用しています。ユーザーにいくつかの追加プロパティを追加する必要があるため、IdentityUserをオーバーライドしました。

Startup.csで

services.AddDefaultIdentity<PortalUser>().AddEntityFrameworkStores<ApplicationDbContext>();

ApplicationDbContext.cs

public partial class ApplicationDbContext : IdentityDbContext<PortalUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {

    }
}

PortalUserクラス

public class PortalUser : IdentityUser
{
    [PersonalData]
    public DateTime? LastLoginDateUtc { get; set; }

    [PersonalData]
    public DateTime? RegistrationDateUtc { get; set; }
}

それはすべて正常に動作しています。経由でユーザーを追加できます。

_userManager.CreateAsync(user)

ただし、AddToRolesAsyncを呼び出してユーザーにロールを追加すると、例外が発生します。なぜアイデアがありますか?

_userManager.AddToRolesAsync(user, new List<string> { roleName });

{System.NotSupportedException: Store does not implement IUserRoleStore<TUser>.
   at Microsoft.AspNetCore.Identity.UserManager`1.GetUserRoleStore()
   at Microsoft.AspNetCore.Identity.UserManager`1.AddToRolesAsync(TUser user, IEnumerable`1 roles)}
9
John81

Startup.csでは、AddRolesが欠落していました。

services.AddDefaultIdentity<PortalUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

あるべき

services.AddDefaultIdentity<PortalUser>()
    .AddRoles<IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

注:順序は重要です。 AddRolesAddEntityFrameworkStoresの前に来る必要があります

28
John81

asp.net Core 2.2にソリューションに関する回答がないため、私が出会った同じエラーを共有したいと思いますasp.net Core 2.2

最初に、asp.net core 2.1https://github.com/aspnet/AspNetCore。 Docs/issues/868

そして、著者のアイデアのおかげで、asp.net core 2.2の公式ガイダンスに従うと問題が発生します(URLはここにあります- asp.net core 2.2のMicrosoftDocs )。彼が言うステップを完了してプロジェクトを実行しようとすると、例外がスローされます「StoreはIUserRoleStoreを実装していません」

問題は、実際には、これはasp.netコア2.1のサンプルです(そして、Microsoftがユーザーにサンプルコードを持たないドキュメントをユーザーに提供する理由はおそらく疑わしいでしょうが、おそらく意味をなさないでしょう)

そして、Areas/Identity/Data/IdentityHostingStartup.cs IdentityHostingStartup :: Configure methodには次のコードがあることがわかります:

services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();

これは、ステップとして/ Program.cs ConfigureServiceに追加するコードと同じです:Add Role services to記載されているドキュメントのIdentity

services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>();

したがって、asp.net core 2.2で同じ問題に遭遇した場合、代替ソリューションは:です

  1. Asp.net 2.2のドキュメントに従う
  2. この章に出会ったとき:Identityにロールサービスを追加し、公式ドキュメントを無視して、それを実行します。

行を置き換える

services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();

services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>();

inAreas/Identity/Data/IdentityHostingStartup.cs IdentityHostingStartup :: Configureメソッドですが、program.csには追加しません(ファイルは削除できません) asp.netコア2.2)

Asp.net Identityを使用するプロジェクトは、リポジトリの後半で更新されます。 WPHelper 、幸運:)

1
Zyuuu

著者がすでに問題を修正していることは知っていますが、上記の回答のすべてのステップを実行し、まだこのエラーが残っている他の人にはこれを追加します。

から Aspnet github

Areas/Identity/IdentityHostingStartup.csで自動生成されたIdentityHostingStartup.Configureメソッドを削除する必要があります

0
Sinepitis