Bagikan melalui


Otorisasi berbasis peran di ASP.NET Core

Ketika identitas dibuat, identitas tersebut mungkin milik satu atau beberapa peran. Misalnya, Tracy mungkin milik Administrator peran dan User sementara Scott mungkin hanya termasuk dalam peran tersebut User . Bagaimana peran ini dibuat dan dikelola tergantung pada penyimpanan dukungan proses otorisasi. Peran diekspos ke pengembang melalui IsInRole metode di ClaimsPrincipal kelas . AddRoles harus ditambahkan ke layanan Peran.

Meskipun peran adalah klaim, tidak semua klaim adalah peran. Bergantung pada penerbit identitas peran mungkin merupakan kumpulan pengguna yang mungkin menerapkan klaim untuk anggota grup, serta klaim aktual pada identitas. Namun, klaim dimaksudkan untuk menjadi informasi tentang pengguna individu. Menggunakan peran untuk menambahkan klaim ke pengguna dapat membingungkan batas antara pengguna dan klaim individu mereka. Kebingungan inilah sebabnya templat SPA tidak dirancang di sekitar peran. Selain itu, untuk organisasi yang bermigrasi dari sistem warisan lokal, proliferasi peran selama bertahun-tahun dapat berarti klaim peran mungkin terlalu besar untuk dimuat dalam token yang dapat digunakan oleh SPAs. Untuk mengamankan SPAs, lihat Menggunakan Identity untuk mengamankan backend API Web untuk SPAs.

Menambahkan layanan Peran ke Identity

Daftarkan layanan otorisasi berbasis peran dengan Program.cs memanggil AddRoles dengan jenis peran dalam konfigurasi aplikasi Identity . Jenis peran dalam contoh berikut adalah IdentityRole:

builder.Services.AddDefaultIdentity<IdentityUser>( ... )
    .AddRoles<IdentityRole>()
    ...

Kode sebelumnya memerlukan Microsoft.AspNetCore.Identity. Paket UI dan using arahan untuk Microsoft.AspNetCore.Identity.

Menambahkan pemeriksaan peran

Pemeriksaan otorisasi berbasis peran:

  • Bersifat deklaratif dan menentukan peran yang harus menjadi anggota pengguna saat ini untuk mengakses sumber daya yang diminta.
  • Diterapkan ke Razor Halaman, pengontrol, atau tindakan dalam pengontrol.
  • Tidak dapat diterapkan di Razor tingkat handler Halaman, mereka harus diterapkan ke Halaman.

Misalnya, kode berikut membatasi akses ke tindakan apa pun pada AdministrationController pengguna yang merupakan anggota Administrator peran:

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
    public IActionResult Index() =>
        Content("Administrator");
}

Beberapa peran dapat ditentukan sebagai daftar yang dipisahkan koma:

[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
    public IActionResult Payslip() =>
                    Content("HRManager || Finance");
}

satu-satunya SalaryController yang dapat diakses oleh pengguna yang merupakan anggota HRManager peran atauFinance peran.

Saat beberapa atribut diterapkan, pengguna yang mengakses harus menjadi anggota dari semua peran yang ditentukan. Sampel berikut mengharuskan pengguna harus menjadi anggota PowerUserperan dan :ControlPanelUser

[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
    public IActionResult Index() =>
        Content("PowerUser && ControlPanelUser");
}

Akses ke tindakan dapat dibatasi dengan menerapkan atribut otorisasi peran tambahan di tingkat tindakan:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{
    public IActionResult SetTime() =>
        Content("Administrator || PowerUser");

    [Authorize(Roles = "Administrator")]
    public IActionResult ShutDown() =>
        Content("Administrator only");
}

Di pengontrol sebelumnya ControlAllPanelController :

  • Administrator Anggota peran atau PowerUser peran dapat mengakses pengontrol dan SetTime tindakan.
  • Hanya anggota peran yang Administrator dapat mengakses ShutDown tindakan.

Pengontrol dapat dikunci tetapi mengizinkan akses anonim dan tidak diautentikasi ke tindakan individual:

[Authorize]
public class Control3PanelController : Controller
{
    public IActionResult SetTime() =>
        Content("[Authorize]");

    [AllowAnonymous]
    public IActionResult Login() =>
        Content("[AllowAnonymous]");
}

Untuk Razor Halaman, [Authorize] dapat diterapkan dengan:

[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public IActionResult OnPost() =>
         Content("OnPost RequireAdministratorRole");
}

Penting

Atribut filter, termasuk AuthorizeAttribute, hanya dapat diterapkan ke PageModel dan tidak dapat diterapkan ke metode penangan halaman tertentu.

Pemeriksaan peran berbasis kebijakan

Persyaratan peran juga dapat dinyatakan menggunakan sintaks Kebijakan, di mana pengembang mendaftarkan kebijakan di startup aplikasi sebagai bagian dari konfigurasi layanan Otorisasi. Ini biasanya terjadi dalam Program.cs file:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

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

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Kebijakan diterapkan menggunakan Policy properti pada [Authorize] atribut :

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

Untuk menentukan beberapa peran yang diizinkan dalam persyaratan, tentukan sebagai parameter ke RequireRole metode :

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("ElevatedRights", policy =>
          policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));
});

var app = builder.Build();

Kode sebelumnya mengotorisasi pengguna yang termasuk dalam Administratorperan , PowerUser atau BackupAdministrator .

Ketika identitas dibuat, identitas tersebut mungkin milik satu atau beberapa peran. Misalnya, Tracy mungkin milik peran Administrator dan Pengguna sementara Scott mungkin hanya termasuk dalam peran Pengguna. Bagaimana peran ini dibuat dan dikelola tergantung pada penyimpanan dukungan proses otorisasi. Peran diekspos ke pengembang melalui IsInRole metode di ClaimsPrincipal kelas .

Sebaiknya jangan gunakan Peran sebagai klaim, melainkan menggunakan klaim. Saat menggunakan Aplikasi Halaman Tunggal (SPAs), lihat Menggunakan Identity untuk mengamankan backend API Web untuk SPAs.

Menambahkan pemeriksaan peran

Pemeriksaan otorisasi berbasis peran:

  • Bersifat deklaratif.
  • Diterapkan ke Razor Halaman, pengontrol, atau tindakan dalam pengontrol.
  • Tidak dapat diterapkan di Razor tingkat handler Halaman, mereka harus diterapkan ke Halaman.

Pemeriksaan otorisasi berbasis peran menentukan peran mana yang harus menjadi anggota pengguna saat ini untuk mengakses sumber daya yang diminta.

Misalnya, kode berikut membatasi akses ke tindakan apa pun pada AdministrationController pengguna yang merupakan anggota Administrator peran:

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
    public IActionResult Index() =>
        Content("Administrator");
}

Beberapa peran dapat ditentukan sebagai daftar yang dipisahkan koma:

[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
    public IActionResult Payslip() =>
                    Content("HRManager || Finance");
}

Pengontrol SalaryController hanya dapat diakses oleh pengguna yang merupakan anggota HRManager peran atau peran.Finance

Jika Anda menerapkan beberapa atribut, maka pengguna yang mengakses harus menjadi anggota dari semua peran yang ditentukan. Sampel berikut mengharuskan pengguna harus menjadi anggota PowerUser peran dan ControlPanelUser :

[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
    public IActionResult Index() =>
        Content("PowerUser && ControlPanelUser");
}

Anda dapat membatasi akses lebih lanjut dengan menerapkan atribut otorisasi peran tambahan di tingkat tindakan:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{
    public IActionResult SetTime() =>
        Content("Administrator || PowerUser");

    [Authorize(Roles = "Administrator")]
    public IActionResult ShutDown() =>
        Content("Administrator only");
}

Jika beberapa atribut diterapkan pada tingkat pengontrol dan tindakan, semua atribut harus lulus sebelum akses diberikan:

[Authorize(Roles = "Administrator")]
public class ControlAllPanelController2 : Controller
{
    public IActionResult SetTime() =>
        Content("Administrator only");

    [Authorize(Roles = "PowerUser")]
    public IActionResult ShutDown() =>
        Content("Administrator && PowerUser");
}

Di pengontrol sebelumnya ControlAllPanelController :

  • Administrator Anggota peran atau PowerUser peran dapat mengakses pengontrol dan SetTime tindakan.
  • Hanya anggota peran yang Administrator dapat mengakses ShutDown tindakan.

Anda juga dapat mengunci pengontrol tetapi mengizinkan akses anonim dan tidak diaturentikasi ke tindakan individual.

[Authorize]
public class Control3PanelController : Controller
{
    public IActionResult SetTime() =>
        Content("[Authorize]");

    [AllowAnonymous]
    public IActionResult Login() =>
        Content("[AllowAnonymous]");
}

Untuk Razor Halaman, [Authorize] dapat diterapkan dengan:

[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

Penting

Atribut filter, termasuk AuthorizeAttribute, hanya dapat diterapkan ke PageModel dan tidak dapat diterapkan ke metode penangan halaman tertentu.

Pemeriksaan peran berbasis kebijakan

Persyaratan peran juga dapat dinyatakan menggunakan sintaks Kebijakan baru, di mana pengembang mendaftarkan kebijakan saat startup sebagai bagian dari konfigurasi layanan Otorisasi. Ini biasanya terjadi dalam ConfigureServices() file Anda Startup.cs .

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

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

Kebijakan diterapkan menggunakan Policy properti pada [Authorize]atribut :

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

Jika Anda ingin menentukan beberapa peran yang diizinkan dalam persyaratan, Anda dapat menentukannya sebagai parameter ke RequireRole metode :

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

Contoh ini memberi otorisasi kepada pengguna yang termasuk dalam Administratorperan , PowerUser atau BackupAdministrator .

Menambahkan layanan Peran ke Identity

Tambahkan AddRoles untuk menambahkan layanan Peran:

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