wake-up-neo.com

Wie verwende ich Rollen in ASP.NET Core 2.1?

Ich habe ein Testprojekt erstellt mit:

dotnet new razor --auth Individual --output Test

Dadurch wird eine Startup.cs erstellt, die Folgendes enthält:

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);
}

Ich möchte einige Benutzer und Rollen festlegen. Sowohl Benutzer als auch Rollen verwenden denselben Speicher (SQLite). Ich verwende eine statische Klasse für das Seeding, die von Program aufgerufen wird.

Ich kann Benutzer festlegen, aber keine Rollen, da das oben Gesagte kein RoleManager zu injizieren scheint.

In ASP.NET Core 2.0 wird Folgendes verwendet:

services.AddIdentity<IdentityUser, IdentityRole>()

Ich vermute AddDefaultIdentity ist neu in 2.1, aber das Problem ist, dass es kein RoleMnager injiziert. Was soll ich also tun?

14
Alan T

Offenbar hat Microsoft schließlich verstanden, dass nicht jede Anwendung Rollen benötigt, und hat sie getrennt.

Beachten Sie, dass AddDefaultIdentity wie folgt deklariert ist:

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

Sie können also weiterhin Identitätsoptionen über IdentityBuilder konfigurieren. Was Sie tun möchten, ist:

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

Glücklicherweise haben sie auch die Einschränkungen IUser und IRole entfernt, sodass Sie jetzt Modelle in einer vollständig separaten Assembly verwenden können, ohne Hunderte von NuGet-Paketen installieren zu müssen.

20

Könnte jemand anderem helfen: Wenn Sie einem vorhandenen Projekt die asp.net-Identität durch Gerüste hinzufügen, müssen Sie das IdentityHostingStartup.cs und ändere die Dienste dort anstatt in deiner Startklasse:

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

Und dann können Sie den Rollenmanager in Ihrem Seeding verwenden.

12

Zusätzlich zu den bereits gegebenen Antworten konnte ich trotz des Hinzufügens von .AddRoles<Identity>() immer noch keine Autorisierung erhalten, wenn ich Authorize(Roles = "Administrator") auf meinen Controllern verwendete. Aus irgendeinem Grund wirkt sich der "Rollenanspruch anscheinend nicht auf IsUserInRole oder AuthorizeAttribute mit einem Rollennamen aus."

Um Rollen zu verwenden, würde ich vorschlagen, dass Sie die ASP.NET 2.0-Methode wie folgt verwenden:

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

Auf diese Weise können Sie Ihre Rollen verwenden und die Identitätsseiten für Sie erstellen.

Lesen Sie dieses Problem bei aspnet github: Ausgabe 181

4
elfico

Ich habe vor einiger Zeit auch mit diesem Problem gekämpft. Ich konnte keine Rollen zum Arbeiten machen.

In meinem Projekt habe ich ASP.NET Core 2.1 verwendet (es könnte in 2.2 behoben werden, siehe Link) und auch einige Seiten gerüstet.

Nach langem Suchen im Internet habe ich diese Lösung gefunden (die auch oben in Ausgabe 181 erwähnt ist)

Die Lösung war für mich (wie im Artikel vorgeschlagen), die folgende Zeile mit IUserClaimsPrincipalFactory hinzuzufügen:

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

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