次を使用してテストプロジェクトを作成しました。
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
を挿入しないことです。
ようやくMicrosoftはすべてのアプリケーションが役割を必要とするわけではないことを理解し、それらを分離したようです。
AddDefaultIdentity
が次のように宣言されていることに注意してください。
public static IdentityBuilder AddDefaultIdentity<TUser>(this IServiceCollection services) where TUser : class;
そのため、IdentityBuilder
を使用して引き続きIdentityオプションを構成できます。あなたがしたいことは:
services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>();
幸いなことに、彼らはIUser
およびIRole
制約も削除したため、何百ものNuGetパッケージをインストールすることなく、完全に独立したアセンブリでモデルを使用できます。
他の人を助けるかもしれない:既存のプロジェクトに足場を介してasp.net IDを追加する場合、スタートアップクラスではなくIdentityHostingStartup.cs
を編集し、そこでサービスを変更する必要があります。
services.AddIdentity<AppUser, IdentityRole>()
.AddDefaultUI()
.AddRoles<IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<authContext>();
そして、シードにロールマネージャーを使用できます。
既に提供されている回答に加えて、.AddRoles<Identity>()
を追加しているにもかかわらず、コントローラーでAuthorize(Roles = "Administrator")
を使用すると、まだ認証を取得できませんでした。何らかの理由で、「ロールクレームは、ロール名を持つIsUserInRoleまたはAuthorizeAttributeに影響を与えないようです。」
ロールを使用するには、以下のようなASP.NET 2.0の方法を使用することをお勧めします。
services.AddIdentity<IdentityUser, IdentityRole>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
このようにして、ロールを使用し、Identityページを取得できます。
Aspnet githubでこの問題を参照してください: Issue 181
私もこの問題と少し前に戦いました。私は役割を働かせることができませんでした。
私のプロジェクトでは、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>();