ASP.NET Core'de rol tabanlı yetkilendirme
Bir kimlik oluşturulduğunda bir veya daha fazla role ait olabilir. Örneğin, Zaman Yönetici ve Kullanıcı rollerine aitken Scott yalnızca Kullanıcı rolüne ait olabilir. Bu rollerin oluşturulma ve yönetilma adımları yetkilendirme işleminin destek deposuna bağlıdır. Roller, ClaimsPrincipal sınıfındaki IsInRole yöntemi aracılığıyla geliştiriciye açık olur.
Rol denetimleri ekleme
Rol tabanlı yetkilendirme denetimleri, geliştiricinin bunları koduna, denetleyici içindeki bir eyleme veya geçerli kullanıcının istenen kaynağa erişmek için üyesi olması gereken rolleri belirterek eklemesine yönelik bildirim — temellidir.
Örneğin, aşağıdaki kod, üzerinde herhangi bir eyleme erişimi AdministrationController rolün üyesi olan kullanıcılarla Administrator sınırlar:
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}
Birden çok rolü virgülle ayrılmış liste olarak belirtebilirsiniz:
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
}
Bu denetleyiciye yalnızca rolün veya rolün üyesi olan HRManager kullanıcılar Finance tarafından erişilebilir.
Birden çok öznitelik uygulayan bir kullanıcı belirtilen tüm rollerin üyesi olmalı; Aşağıdaki örnek, bir kullanıcının hem hem de rolünün üyesi PowerUser olması ControlPanelUser gerekir.
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
}
Eylem düzeyinde ek rol yetkilendirmesi öznitelikleri uygulayarak erişimi daha da sınırlaya siniz:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
public ActionResult SetTime()
{
}
[Authorize(Roles = "Administrator")]
public ActionResult ShutDown()
{
}
}
Önceki kod parçacığında rolün veya rolün üyeleri denetleyiciye ve eyleme erişebilirsiniz, ancak yalnızca rolün Administrator PowerUser üyeleri SetTime Administrator eyleme ShutDown erişebilirsiniz.
Ayrıca, bir denetleyiciyi kilitleyip tek tek eylemlere anonim, kimliği doğrulanmamış erişime izin veebilirsiniz.
[Authorize]
public class ControlPanelController : Controller
{
public ActionResult SetTime()
{
}
[AllowAnonymous]
public ActionResult Login()
{
}
}
Sayfalar Razor için, AuthorizeAttribute şu iki şekilde de uygulanabilir:
- Veya kuralıkullanma
- Örneğine
AuthorizeAttributePageModeluygulama:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
public ActionResult OnPost()
{
}
}
Önemli
dahil filtre öznitelikleri yalnızca AuthorizeAttribute PageModel'e uygulanabilir ve belirli sayfa işleyici yöntemlerine uygulanamaz.
İlke tabanlı rol denetimleri
Rol gereksinimleri, bir geliştiricinin Yetkilendirme hizmeti yapılandırmasının bir parçası olarak başlangıçta bir ilkeyi kaydeden yeni İlke söz dizimi kullanılarak da ifade olabilir. Bu durum normalde ConfigureServices() Startup.cs dosyanız içinde gerçekleşir.
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"));
});
}
İlkeler Policy özniteliğinin özelliği kullanılarak AuthorizeAttribute uygulanır:
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
return View();
}
Bir gereksinimde izin verilen birden çok rol belirtmek için bunları yöntemine parametre olarak RequireRole belirtebilirsiniz:
options.AddPolicy("ElevatedRights", policy =>
policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));
Bu örnek, veya rollerine ait kullanıcıları Administrator PowerUser BackupAdministrator yetkilendir.
Rol hizmetleri'ne ekleme Identity
Rol hizmetleri eklemek için AddRoles ekleyin:
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);
}