ASP.NET Core でのロールベースの承認Role-based authorization in ASP.NET Core

Id が作成されると、1つまたは複数のロールに属することができます。When an identity is created it may belong to one or more roles. たとえば、Tracy は管理者ロールとユーザーロールに属している場合がありますが、Scott はユーザーロールのみに属している可能性があります。For example, Tracy may belong to the Administrator and User roles whilst Scott may only belong to the User role. これらのロールを作成および管理する方法は、承認プロセスのバッキングストアによって異なります。How these roles are created and managed depends on the backing store of the authorization process. ロールは、 ClaimsPrincipalクラスのIsInRoleメソッドを使用して開発者に公開されます。Roles are exposed to the developer through the IsInRole method on the ClaimsPrincipal class.

ロールチェックの追加Adding role checks

ロールベースの承認チェックは宣言型です — 。開発者は、コントローラーまたはコントローラー内のアクションに対してコード内にそれらを埋め込み、要求されたリソースにアクセスするために、現在のユーザーがメンバーである必要があるロールを指定します。Role-based authorization checks are declarative—the developer embeds them within their code, against a controller or an action within a controller, specifying roles which the current user must be a member of to access the requested resource.

たとえば、次のコードは、のアクションへのアクセスを、 AdministrationController ロールのメンバーであるユーザーに制限し Administrator ます。For example, the following code limits access to any actions on the AdministrationController to users who are a member of the Administrator role:

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

複数のロールは、コンマ区切りの一覧として指定できます。You can specify multiple roles as a comma separated list:

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

このコントローラーにアクセスできるのは、ロールまたはロールのメンバーであるユーザーだけ HRManager Finance です。This controller would be only accessible by users who are members of the HRManager role or the Finance role.

複数の属性を適用する場合、アクセスするユーザーは、指定されたすべてのロールのメンバーである必要があります。次の例では、ユーザーがとの両方のロールのメンバーである必要があり PowerUser ControlPanelUser ます。If you apply multiple attributes then an accessing user must be a member of all the roles specified; the following sample requires that a user must be a member of both the PowerUser and ControlPanelUser role.

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

アクションレベルで追加のロール承認属性を適用することで、さらにアクセスを制限できます。You can further limit access by applying additional role authorization attributes at the action level:

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

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

前のコードスニペットでは、ロールのメンバー、 Administrator または PowerUser ロールはコントローラーとアクションにアクセスできますが、ロール SetTime のメンバーだけが Administrator アクションにアクセスでき ShutDown ます。In the previous code snippet members of the Administrator role or the PowerUser role can access the controller and the SetTime action, but only members of the Administrator role can access the ShutDown action.

コントローラーをロックダウンすることもできますが、個々のアクションへの認証されていない匿名アクセスが許可されます。You can also lock down a controller but allow anonymous, unauthenticated access to individual actions.

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

    [AllowAnonymous]
    public ActionResult Login()
    {
    }
}

ページの場合 Razor 、は AuthorizeAttribute 次のいずれかの方法で適用できます。For Razor Pages, the AuthorizeAttribute can be applied by either:

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

重要

フィルター属性 (を含む) は AuthorizeAttribute 、PageModel にのみ適用でき、特定のページハンドラーメソッドには適用できません。Filter attributes, including AuthorizeAttribute, can only be applied to PageModel and cannot be applied to specific page handler methods.

ポリシーベースのロールチェックPolicy based role checks

ロール要件は、新しいポリシー構文を使用して表すこともできます。ここでは、開発者が承認サービス構成の一部としてスタートアップ時にポリシーを登録します。Role requirements can also be expressed using the new Policy syntax, where a developer registers a policy at startup as part of the Authorization service configuration. これは通常、 ConfigureServices() Startup.csファイル内で発生します。This normally occurs in ConfigureServices() in your Startup.cs file.

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 ます。Policies are applied using the Policy property on the AuthorizeAttribute attribute:

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

要件に複数の許可されたロールを指定する場合は、メソッドのパラメーターとして指定でき RequireRole ます。If you want to specify multiple allowed roles in a requirement then you can specify them as parameters to the RequireRole method:

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

この例 Administrator では、、、またはロールに属しているユーザーを承認 PowerUser BackupAdministrator します。This example authorizes users who belong to the Administrator, PowerUser or BackupAdministrator roles.

役割サービスの追加先IdentityAdd Role services to Identity

役割サービスを追加するには、 Addrolesを追加します。Append AddRoles to add Role services:

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