ASP.NET Core でのロールベースの承認

Id が作成されると、1つまたは複数のロールに属することができます。 たとえば、Tracy は管理者ロールとユーザーロールに属している場合がありますが、Scott はユーザーロールのみに属している可能性があります。 これらのロールを作成および管理する方法は、承認プロセスのバッキングストアによって異なります。 ロールは、 ClaimsPrincipalクラスのIsInRoleメソッドを使用して開発者に公開されます。

ロールチェックの追加

ロールベースの承認チェックは宣言型です — 。開発者は、コントローラーまたはコントローラー内のアクションに対してコード内にそれらを埋め込み、要求されたリソースにアクセスするために、現在のユーザーがメンバーである必要があるロールを指定します。

たとえば、次のコードは、のアクションへのアクセスを、 AdministrationController ロールのメンバーであるユーザーに制限し Administrator ます。

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}

複数のロールは、コンマ区切りの一覧として指定できます。

[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
}

このコントローラーにアクセスできるのは、ロールまたはロールのメンバーであるユーザーだけ HRManager Finance です。

複数の属性を適用する場合、アクセスするユーザーは、指定されたすべてのロールのメンバーである必要があります。次の例では、ユーザーがとの両方のロールのメンバーである必要があり PowerUser ControlPanelUser ます。

[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
}

アクションレベルで追加のロール承認属性を適用することで、さらにアクセスを制限できます。

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

前のコードスニペットでは、ロールのメンバー、 Administrator または PowerUser ロールはコントローラーとアクションにアクセスできますが、ロール SetTime のメンバーだけが Administrator アクションにアクセスでき ShutDown ます。

コントローラーをロックダウンすることもできますが、個々のアクションへの認証されていない匿名アクセスが許可されます。

[Authorize]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [AllowAnonymous]
    public ActionResult Login()
    {
    }
}

ページの場合 Razor 、は AuthorizeAttribute 次のいずれかの方法で適用できます。

  • 規則の使用、または
  • AuthorizeAttributeをインスタンスに適用し PageModel ます。
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

重要

フィルター属性 (を含む) は AuthorizeAttribute 、PageModel にのみ適用でき、特定のページハンドラーメソッドには適用できません。

ポリシー ベースのロール チェック

ロールの要件は、新しいポリシー構文を使用して表現することもできます。この構文では、開発者が承認サービス構成の一部として起動時にポリシーを登録します。 これは通常 ConfigureServices() 、Startup.cs ファイルで発生 します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdministratorRole",
             policy => policy.RequireRole("Administrator"));
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdministratorRole",
             policy => policy.RequireRole("Administrator"));
    });
}

ポリシーは、 属性の プロパティ Policy を使用して適用 AuthorizeAttribute されます。

[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
    return View();
}

要件で複数の許可ロールを指定する場合は、 メソッドのパラメーターとして指定 RequireRole できます。

options.AddPolicy("ElevatedRights", policy =>
                  policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));

この例では、 ロールまたは ロールに属する Administrator ユーザー PowerUser を承認 BackupAdministrator します。

ロール サービスを に追加する Identity

AddRoles を追加してロール サービスを追加します。

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();
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddRoles<IdentityRole>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();

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