web-dev-qa-db-fra.com

Comment utiliser les rôles dans ASP.NET Core 2.1?

J'ai créé un projet de test en utilisant:

dotnet new razor --auth Individual --output Test

Cela crée un fichier Startup.cs contenant:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlite(
            Configuration.GetConnectionString("DefaultConnection")));

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

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

Je veux créer des utilisateurs et des rôles. Les utilisateurs et les rôles utiliseront le même magasin (SQLite). J'utilise une classe statique pour l'ensemencement qui s'appelle de Program.

Je peux créer des utilisateurs, mais pas des rôles, car ce qui précède ne semble pas injecter un RoleManager.

Dans ASP.NET Core 2.0, les éléments suivants sont utilisés:

services.AddIdentity<IdentityUser, IdentityRole>()

Je suppose que AddDefaultIdentity est nouveau dans la version 2.1, mais le problème est qu’il n’injecte pas de RoleMnager, alors que dois-je faire?

14
Alan T

Il semble que finalement Microsoft a compris que toutes les applications n’ont pas besoin de rôles et les a séparées.

Notez que AddDefaultIdentity est déclaré comme:

public static IdentityBuilder AddDefaultIdentity<TUser>(this IServiceCollection services) where TUser : class;

Vous pouvez donc continuer à configurer les options d’identité via IdentityBuilder. Ce que tu veux faire c'est:

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

Heureusement, ils ont également supprimé les contraintes IUser et IRole. Vous pouvez donc maintenant utiliser des modèles dans un assembly complètement séparé sans avoir à installer des centaines de packages NuGet.

20

Pourrait aider quelqu'un d'autre: si vous ajoutez une identité asp.net via un échafaudage à un projet existant, vous devez modifier le fichier IdentityHostingStartup.cs et changez les services à la place de votre classe de démarrage:

services.AddIdentity<AppUser, IdentityRole>()
                .AddDefaultUI()
                .AddRoles<IdentityRole>()
                .AddRoleManager<RoleManager<IdentityRole>>()
                .AddDefaultTokenProviders()
                .AddEntityFrameworkStores<authContext>();

Et vous pouvez ensuite utiliser le gestionnaire de rôles dans votre classement.

12
Jonathan Galentine

En plus des réponses déjà fournies, malgré l'ajout de .AddRoles<Identity>(), je ne pouvais toujours pas obtenir l'autorisation lorsque j'utilisais Authorize(Roles = "Administrator") sur mes contrôleurs. Pour une raison quelconque, "la revendication de rôle ne semble pas affecter IsUserInRole ou AuthorizeAttribute avec un nom de rôle".

Pour utiliser les rôles, je suggérerais que l’on utilise la manière ASP.NET 2.0 comme ci-dessous:

services.AddIdentity<IdentityUser, IdentityRole>()
            .AddDefaultUI()
            .AddDefaultTokenProviders()
            .AddEntityFrameworkStores<ApplicationDbContext>();

De cette façon, vous pouvez utiliser vos rôles et obtenir les pages d’identité personnalisées.

Reportez-vous à ce problème sur aspnet github: Issue 181

4
elfico

Je me suis aussi battu avec ce problème il y a un moment. Je ne pouvais pas créer de rôles pour travailler.

Dans mon projet, j'ai utilisé ASP.NET Core 2.1 (il pourrait être corrigé dans la version 2.2, voir lien) et également échafaudé certaines pages.

Après de longues recherches sur Internet, j'ai trouvé cette solution (qui est également mentionnée ci-dessus dans Issue 181 )

La solution a été pour moi (comme proposé dans l'article) d'ajouter la ligne suivante avec IUserClaimsPrincipalFactory:

        services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>, 
            UserClaimsPrincipalFactory<IdentityUser, IdentityRole>>();

        services.AddDefaultIdentity<IdentityUser>()
            .AddRoles<IdentityRole>()
            .AddRoleManager<RoleManager<IdentityRole>>()
            .AddDefaultTokenProviders()
            .AddEntityFrameworkStores<TranslatorDbContext>();
1
Andre