ASP.NET de Base de l'Identité: Pas de service pour rôle de manager
J'ai un ASP.NET Core application qui utilise l'Identité. Cela fonctionne, mais lorsque j'essaie d'ajouter des rôles de la base de données j'ai des problèmes.
En Démarrage ConfigureServices
j'ai ajouté de l'Identité et le rôle de gestionnaire d'étendue de ce type de service:
services.AddIdentity<Entities.DB.User, IdentityRole<int>>()
.AddEntityFrameworkStores<MyDBContext, int>();
services.AddScoped<RoleManager<IdentityRole>>();
et de Démarrage Configure
j'injecte RoleManager et de le passer à ma classe personnalisée RolesData
:
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory,
RoleManager<IdentityRole> roleManager
)
{
app.UseIdentity();
RolesData.SeedRoles(roleManager).Wait();
app.UseMvc();
C'est le RolesData
classe:
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");
}
}
}
}
}
L'application appuie sans erreurs, mais lorsque j'essaie d'accéder à ce que je reçois l'erreur suivante:
Parvenez pas à résoudre pour le type de service 'Microsoft.AspNetCore.Identity.IRoleStore`1[Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole]' lors de la tentative pour activer Microsoft.AspNetCore.L'identité.RoleManager
Ce que je fais mal? Mon petit doigt me dit qu'il y a quelque chose de mal avec la façon dont je ajouter de la RoleManager en tant que service.
PS: j'ai utilisé "Aucune authentification" lors de la création du projet à savoir l'Identité à partir de zéro.
Un tout nouveau projet avec "comptes d'utilisateurs individuels", a ajouté ne contiennent pas de code qui définit les rôles.
non, il n'est pas, mais il pourrait avoir un peu de code que les fils jusqu'dépendances vous n'avez pas câblé correctement
Sur une autre note, vous devez éviter d'injecter l'étendue des dépendances comme
RoleManager
dans le Configure
méthode, car elle permettra d'éviter le sous-jacent DbContext
d'être éliminés correctement. Au lieu de cela, pensez à utiliser IServiceScopeFactory.CreateScope()
pour créer un champ d'application du service qui seront vendus lors de votre SeedRoles
méthode retourne (vous pouvez prendre un coup d'oeil à github.com/openiddict/openiddict-samples/blob/master/samples/... pour un exemple)
OriginalL'auteur Glenn Utter | 2017-01-02
Vous devez vous connecter pour publier un commentaire.
L'enregistrement de la partie est en fait amende, tho', vous devez supprimer
services.AddScoped<RoleManager<IdentityRole>>()
, que le rôle du gestionnaire est déjà ajoutés parservices.AddIdentity()
.Votre problème est probablement causé par un générique d'incompatibilité de type: tandis que vous appelez
services.AddIdentity()
avecIdentityRole<int>
, vous essayez de résoudreRoleManager
avecIdentityRole
, qui est un équivalent deIdentityRole<string>
(string
être le type de clé par défaut dans ASP.NET de Base de l'Identité).Mise à jour de votre
Configure
méthode pour prendre unRoleManager<IdentityRole<int>>
paramètre et cela devrait fonctionner.Cela a été d'une grande correction et très utile. Je recommande également l'appel de la SeedRoles à partir d'un DatabaseInitializer de sorte que le CreateUsers et les rôles asynchrone à partir du démarrage de quelque chose comme
code
public async Task SeedAsync(){ attendent CreateUsersAsync(); attendent RolesData.SeedRoles(_roleManager);}OriginalL'auteur Pinpoint