J'ai essayé d'utiliser protected override void OnModelCreating(ModelBuilder builder)
dans ma classe IdentityDataContext et de créer une migration qui amorcera ces données:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
const string ADMIN_ID = "b4280b6a-0613-4cbd-a9e6-f1701e926e73";
const string ROLE_ID = ADMIN_ID;
builder.Entity<IdentityRole>().HasData(new IdentityRole
{
Id = ROLE_ID,
Name = "admin",
NormalizedName = "ADMIN"
});
builder.Entity<MyIdentityUser>().HasData(new MyIdentityUser
{
Id = ADMIN_ID,
UserName = "[email protected]",
NormalizedUserName = "[email protected]",
Email = "[email protected]",
NormalizedEmail = "[email protected]",
EmailConfirmed = true,
PasswordHash = "AQABBAEABCcQAABAEBhd37krE/TyMklt3SIf2Q3ITj/dunHYr7O5Z9UB0R1+dpDbcrHWuTBr8Uh5WR+JrQ==",
SecurityStamp = "VVPCRDAS3MJWQD5CSW2GWPRADBXEZINA",
ConcurrencyStamp = "c8554266-b401-4519-9aeb-a9283053fc58"
});
builder.Entity<IdentityUserRole<string>>().HasData(new IdentityUserRole<string>
{
RoleId = ROLE_ID,
UserId = ADMIN_ID
});
}
qui semble fonctionner, mais je ne peux pas accéder à mon point de terminaison dans la page Razor décorée avec l'attribut Authorize. C'est étrange parce que j'ai toutes ces données dans ma base de données. Je peux me connecter en tant que cet utilisateur et je vois qu'il y a un rôle "admin" dans la table AspNetRoles. J'ai également mappé l'utilisateur au rôle correctement dans la table AspNetUserRoles.
[Authorize(Roles="admin")]
public class IndexModel : PageModel
{
public async Task<IActionResult> OnGetAsync()
{
return Page();
}
}
Je suis redirigé pour accéder à la page refusée lorsque je suis connecté en tant qu'utilisateur au-dessus qui, selon la base de données, a le rôle d'administrateur.
J'ai vu que certaines personnes essayaient de faire cette méthode d'amorçage dans la méthode Configure dans la classe de démarrage, mais je rencontre actuellement des problèmes avec l'injection de dépendance lorsque j'essaie de le faire avec RoleManager et UserManager:
System.InvalidOperationException: No service for type 'Microsoft.AspNetCore.Identity.RoleManager`1[Microsoft.AspNetCore.Identity.IdentityRole]' has been registered.
J'étais presque là. Ce n'était pas évident au début, mais j'avais besoin d'ajouter la ligne .AddRoles<IdentityRole>()
dans ma méthode Configure du fichier IdentityHostingStartup.cs.
Il est mentionné à la fin de la page d'autorisation basée sur les rôles de la documentation asp.net core 3.1: lien vers la documentation
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddControllersWithViews();
services.AddRazorPages();
}
Je pensais que les rôles étaient déjà pris en considération et je n'ai pas besoin d'ajouter explicitement cette fonction.
Il doit être indiqué en haut de la page que pour ajouter une autorisation basée sur les rôles, vous devez ajouter .AddRoles<IdentityRole>()
à votre méthode Configure. Au lieu de cela, vous êtes présenté avec de nombreuses combinaisons d'attributs d'autorisation, puis en bas, il y a un bref paragraphe "Ajouter des services de rôle à l'identité" qui ne donne aucune explication que c'est ce qui fait que tout fonctionne.