web-dev-qa-db-ja.com

ASP.NET Core 2.1でロールを使用する方法は?

次を使用してテストプロジェクトを作成しました。

dotnet new razor --auth Individual --output Test

これにより、以下を含むStartup.csが作成されます。

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

いくつかのユーザーとロールをシードします。ユーザーとロールの両方が同じストア(SQLite)を使用します。 Programから呼び出されるシードに静的クラスを使用しています。

上記ではRoleManagerを注入しないように見えるため、ユーザーをシードできますが、ロールはシードできません。

ASP.NET Core 2.0では、次のものが使用されます。

services.AddIdentity<IdentityUser, IdentityRole>()

AddDefaultIdentityは2.1の新機能だと思いますが、問題はRoleMnagerを挿入しないことです。

14
Alan T

ようやくMicrosoftはすべてのアプリケーションが役割を必要とするわけではないことを理解し、それらを分離したようです。

AddDefaultIdentityが次のように宣言されていることに注意してください。

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

そのため、IdentityBuilderを使用して引き続きIdentityオプションを構成できます。あなたがしたいことは:

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

幸いなことに、彼らはIUserおよびIRole制約も削除したため、何百ものNuGetパッケージをインストールすることなく、完全に独立したアセンブリでモデルを使用できます。

20

他の人を助けるかもしれない:既存のプロジェクトに足場を介してasp.net IDを追加する場合、スタートアップクラスではなくIdentityHostingStartup.csを編集し、そこでサービスを変更する必要があります。

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

そして、シードにロールマネージャーを使用できます。

12

既に提供されている回答に加えて、.AddRoles<Identity>()を追加しているにもかかわらず、コントローラーでAuthorize(Roles = "Administrator")を使用すると、まだ認証を取得できませんでした。何らかの理由で、「ロールクレームは、ロール名を持つIsUserInRoleまたはAuthorizeAttributeに影響を与えないようです。」

ロールを使用するには、以下のようなASP.NET 2.0の方法を使用することをお勧めします。

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

このようにして、ロールを使用し、Identityページを取得できます。

Aspnet githubでこの問題を参照してください: Issue 181

4
elfico

私もこの問題と少し前に戦いました。私は役割を働かせることができませんでした。

私のプロジェクトでは、ASP.NET Core 2.1(2.2で修正可能、リンクを参照)を使用し、いくつかのページを足場にしました。

インターネットで長時間検索した後、私はこの解決策を見つけました(これも Issue 181 で説明しています)

解決策は(記事で提案されているように)IUserClaimsPrincipalFactoryに次の行を追加することでした:

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

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