Otorisasi berbasis peran di ASP.NET Core
identity Ketika dibuat, peran 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 identity penerbit peran mungkin merupakan kumpulan pengguna yang mungkin menerapkan klaim untuk anggota grup, serta klaim aktual pada identity. 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 atau Finance
peran.
Saat beberapa atribut diterapkan, 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");
}
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 atauPowerUser
peran dapat mengakses pengontrol danSetTime
tindakan.- Hanya anggota peran yang
Administrator
dapat mengaksesShutDown
tindakan.
Pengontrol dapat diamankan 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:
- Menggunakan konvensi, atau
- Menerapkan ke
[Authorize]
PageModel
instans:
[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 Administrator
peran , PowerUser
atau BackupAdministrator
.
identity Ketika dibuat, peran 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 atauPowerUser
peran dapat mengakses pengontrol danSetTime
tindakan.- Hanya anggota peran yang
Administrator
dapat mengaksesShutDown
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:
- Menggunakan konvensi, atau
- Menerapkan ke
[Authorize]
PageModel
instans:
[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 Administrator
peran , 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();
}
ASP.NET Core