web-dev-qa-db-fra.com

Store n'implémente pas l'identité IUserRoleStore <TUser> ASP.NET Core 2.1

J'utilise l'identité ASP.NET Core 2.1. J'ai remplacé IdentityUser car je dois ajouter des propriétés supplémentaires à l'utilisateur.

Dans Startup.cs

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

ApplicationDbContext.cs

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

    }
}

PortalUser class

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

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

Tout fonctionne bien. Je peux ajouter un utilisateur via.

_userManager.CreateAsync(user)

Cependant, lorsque j'appelle AddToRolesAsync pour ajouter un rôle à un utilisateur, j'obtiens une exception. Des idées pourquoi?

_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

Dans Startup.cs, je manquais AddRoles donc

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

devrait être

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

Remarque: la commande est critique. AddRoles doit précéder AddEntityFrameworkStores

28
John81

Car il n'y a pas de réponses sur la solution dans asp.net Core 2.2 , je voudrais partager la même erreur que je rencontre dans asp.net Core 2.2

Tout d'abord, voici une autre solution pour la même erreur dans asp.net core 2.1 https://github.com/aspnet/AspNetCore. Docs/issues/868

Et grâce à l'idée de l'auteur, je rencontre le problème lorsque je suis le guide officiel dans asp.net core 2.2 (l'url est ici: - MicrosoftDocs pour asp.net core 2.2 ). Lorsque je termine l'étape qu'il dit et que j'essaie d'exécuter le projet, il lève une exception "Store n'implémente pas IUserRoleStore"

et le problème est: en fait, c'est l'exemple pour asp.net core 2.1 (Et je doute fortement que la raison pour laquelle Microsoft fournira aux utilisateurs une documentation sans aucun exemple de code, ce qui n'a probablement pas de sens)

Et vous constaterez que, dans Zones/Identité/Données/IdentityHostingStartup.cs IdentityHostingStartup :: Configure, méthode , vous avez les codes suivants:

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

qui est le même que le code que vous devez ajouter dans /Program.cs ConfigureService comme étape: Ajouter des services de rôle à Identité dans les documents mentionnés:

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

donc si vous rencontrez le même problème dans asp.net core 2.2, une solution alternative est:

  1. Suivre les documents dans asp.net 2.2
  2. Lorsque vous rencontrez ce chapitre: Ajoutez des services de rôle à l'identité , ignorez simplement les documents officiels et faites-le:

remplacer la rangée

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

avec

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

dans Zones/Identité/Données/IdentityHostingStartup.cs IdentityHostingStartup :: Configure , mais ne l'ajoutez pas dans program.cs (le fichier ne peut pas être supprimé dans asp.net core 2.2)

Le projet que j'utilise Asp.net Identity sera mis à jour plus tard dans mes dépôts: WPHelper , Good Luck :)

1
Zyuuu

Je sais que l'auteur a déjà résolu son problème, mais je vais l'ajouter pour toute autre personne qui a effectué toutes les étapes de la réponse ci-dessus et qui a toujours cette erreur.

De Aspnet github

Vous devez supprimer la méthode IdentityHostingStartup.Configure générée automatiquement dans Areas/Identity/IdentityHostingStartup.cs

0
Sinepitis