ASP.NET Core'da rol tabanlı yetkilendirme
bir oluşturulduğunda bir identity veya daha fazla role ait olabilir. Örneğin, Tracy ve User
rollerine Administrator
aitken Scott yalnızca role ait User
olabilir. Bu rollerin nasıl oluşturulduğu ve yönetilme şekli yetkilendirme işleminin yedekleme deposuna bağlıdır. Roller, sınıfındaki yöntemi aracılığıyla geliştiriciye IsInRole ClaimsPrincipal sunulur. AddRoles rol hizmetlerine eklenmelidir.
Roller talep olsa da, tüm talepler rol değildir. Verene identity bağlı olarak bir rol, grup üyeleri için talep uygulayabilecek bir kullanıcı koleksiyonu ve üzerinde gerçek bir identitytalep olabilir. Ancak, talepler tek bir kullanıcı hakkında bilgi olarak tasarlanmalıdır. Kullanıcıya talep eklemek için rollerin kullanılması, kullanıcı ile tek tek talepleri arasındaki sınırı karıştırabilir. Bu karışıklık, SPA şablonlarının roller etrafında tasarlanmamasıdır. Buna ek olarak, şirket içi eski bir sistemden geçiş yapılan kuruluşlarda rollerin yıllar içinde yaygınlaşması, rol talebi SPA'lar tarafından kullanılabilen bir belirtecin içinde bulunamayacak kadar büyük olabileceği anlamına gelebilir. SPA'ların güvenliğini sağlamak için bkz. SPA'lar için Bir Web API arka ucu güvenliğini sağlamak için kullanmaIdentity.
'a Rol hizmetleri ekleme Identity
Uygulamanın Identity yapılandırmasındaki Program.cs
rol türüyle arayarak AddRoles rol tabanlı yetkilendirme hizmetlerini 'ye kaydedin. Aşağıdaki örnekteki rol türü:IdentityRole
builder.Services.AddDefaultIdentity<IdentityUser>( ... )
.AddRoles<IdentityRole>()
...
Yukarıdaki kod Için Microsoft.AspNetCore.Identity. KULLANıCı arabirimi paketi ve için Microsoft.AspNetCore.Identity
bir using
yönergesi.
Rol denetimleri ekleme
Rol tabanlı yetkilendirme denetimleri:
- Bildirim temellidir ve istenen kaynağa erişmek için geçerli kullanıcının üyesi olması gereken rolleri belirtin.
- Bir denetleyici içindeki Sayfalara Razor , denetleyicilere veya eylemlere uygulanır.
- Sayfa işleyici düzeyinde uygulanamıyorRazor, Sayfaya uygulanmalıdır.
Örneğin, aşağıdaki kod üzerindeki AdministrationController
tüm eylemlere erişimi rolün Administrator
üyesi olan kullanıcılarla sınırlar:
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
public IActionResult Index() =>
Content("Administrator");
}
Birden çok rol virgülle ayrılmış liste olarak belirtilebilir:
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
public IActionResult Payslip() =>
Content("HRManager || Finance");
}
SalaryController
öğesine yalnızca rolün veya Finance
rolün HRManager
üyesi olan kullanıcılar erişebilir.
Birden çok öznitelik uygulandığında, erişen bir kullanıcının belirtilen tüm rollerin üyesi olması gerekir. Aşağıdaki örnek, bir kullanıcının hem hemControlPanelUser
de rolününPowerUser
üyesi olmasını gerektirir:
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
public IActionResult Index() =>
Content("PowerUser && ControlPanelUser");
}
Eylem düzeyinde ek rol yetkilendirme öznitelikleri uygulanarak eyleme erişim sınırlandırılabilir:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{
public IActionResult SetTime() =>
Content("Administrator || PowerUser");
[Authorize(Roles = "Administrator")]
public IActionResult ShutDown() =>
Content("Administrator only");
}
Önceki ControlAllPanelController
denetleyicide:
- Rolün
Administrator
veya rolünPowerUser
üyeleri denetleyiciye ve eylemeSetTime
erişebilir. - Eyleme
Administrator
yalnızca rolünShutDown
üyeleri erişebilir.
Bir denetleyici güvenli hale getirilebilir ancak tek tek eylemlere anonim, kimliği doğrulanmamış erişime izin verebilir:
[Authorize]
public class Control3PanelController : Controller
{
public IActionResult SetTime() =>
Content("[Authorize]");
[AllowAnonymous]
public IActionResult Login() =>
Content("[AllowAnonymous]");
}
Sayfalar için Razor , [Authorize]
aşağıdakilerden biri tarafından uygulanabilir:
- Kural kullanma veya
[Authorize]
örneğinePageModel
uygulama:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
public IActionResult OnPost() =>
Content("OnPost RequireAdministratorRole");
}
Önemli
dahil olmak üzere AuthorizeAttribute
filtre öznitelikleri yalnızca 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 uygulama başlangıcında ilkeyi kaydettirdiği İlke söz dizimi kullanılarak da ifade edilebilir. Bu genellikle dosyada Program.cs
oluşur:
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();
İlkeler özniteliğindeki Policy [Authorize]
özelliği kullanılarak uygulanır:
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
return View();
}
Bir gereksinimde izin verilen birden çok rol belirtmek için bunları yöntemine RequireRole parametre olarak belirtin:
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();
Yukarıdaki kod, öğesine PowerUser
veya BackupAdministrator
rollerine Administrator
ait olan kullanıcıları yetkiler.
bir oluşturulduğunda bir identity veya daha fazla role ait olabilir. Örneğin, Tracy Yönetici ve Kullanıcı rollerine aitken Scott yalnızca Kullanıcı rolüne ait olabilir. Bu rollerin nasıl oluşturulduğu ve yönetilme şekli yetkilendirme işleminin yedekleme deposuna bağlıdır. Roller, sınıfındaki yöntemi aracılığıyla geliştiriciye IsInRole ClaimsPrincipal sunulur.
Rolleri talep olarak değil, talep olarak kullanmanızı öneririz. Tek Sayfalı Uygulamalar (SPA' lar) kullanırken bkz. SPA'lar için Web API arka ucu güvenliğini sağlamak için kullanmaIdentity.
Rol denetimleri ekleme
Rol tabanlı yetkilendirme denetimleri:
- Bildirim temellidir.
- Bir denetleyici içindeki Sayfalara Razor , denetleyicilere veya eylemlere uygulanır.
- Sayfa işleyici düzeyinde uygulanamıyorRazor, Sayfaya uygulanmalıdır.
Rol tabanlı yetkilendirme denetimleri, istenen kaynağa erişmek için geçerli kullanıcının hangi rollere üye olması gerektiğini belirtir.
Örneğin, aşağıdaki kod üzerindeki AdministrationController
tüm eylemlere erişimi rolün Administrator
üyesi olan kullanıcılarla sınırlar:
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
public IActionResult Index() =>
Content("Administrator");
}
Birden çok rol virgülle ayrılmış liste olarak belirtilebilir:
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
public IActionResult Payslip() =>
Content("HRManager || Finance");
}
Denetleyiciye SalaryController
yalnızca rolün veya Finance
rolün HRManager
üyesi olan kullanıcılar erişebilir.
Birden çok öznitelik uygularsanız, erişen bir kullanıcı belirtilen tüm rollerin üyesi olmalıdır. Aşağıdaki örnek, bir kullanıcının hem hem ControlPanelUser
de rolünün PowerUser
üyesi olmasını gerektirir:
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
public IActionResult Index() =>
Content("PowerUser && ControlPanelUser");
}
Eylem düzeyinde ek rol yetkilendirme öznitelikleri uygulayarak erişimi daha fazla sınırlayabilirsiniz:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{
public IActionResult SetTime() =>
Content("Administrator || PowerUser");
[Authorize(Roles = "Administrator")]
public IActionResult ShutDown() =>
Content("Administrator only");
}
Denetleyici ve eylem düzeylerinde birden çok öznitelik uygulanırsa, erişim verilmeden önce tüm özniteliklerin geçmesi gerekir:
[Authorize(Roles = "Administrator")]
public class ControlAllPanelController2 : Controller
{
public IActionResult SetTime() =>
Content("Administrator only");
[Authorize(Roles = "PowerUser")]
public IActionResult ShutDown() =>
Content("Administrator && PowerUser");
}
Önceki ControlAllPanelController
denetleyicide:
- Rolün
Administrator
veya rolünPowerUser
üyeleri denetleyiciye ve eylemeSetTime
erişebilir. - Eyleme
Administrator
yalnızca rolünShutDown
üyeleri erişebilir.
Ayrıca bir denetleyiciyi kilitleyebilir ancak tek tek eylemlere anonim, kimliği doğrulanmamış erişime izin vekleyebilirsiniz.
[Authorize]
public class Control3PanelController : Controller
{
public IActionResult SetTime() =>
Content("[Authorize]");
[AllowAnonymous]
public IActionResult Login() =>
Content("[AllowAnonymous]");
}
Sayfalar için Razor , [Authorize]
aşağıdakilerden biri tarafından uygulanabilir:
- Kural kullanma veya
[Authorize]
örneğinePageModel
uygulama:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
public ActionResult OnPost()
{
}
}
Önemli
dahil olmak üzere AuthorizeAttribute
filtre öznitelikleri yalnızca PageModel'e uygulanabilir ve belirli sayfa işleyici yöntemlerine uygulanamaz.
İlke tabanlı rol denetimleri
Rol gereksinimleri, geliştiricinin yetkilendirme hizmeti yapılandırmasının bir parçası olarak başlangıçta ilkeyi kaydettirdiği yeni İlke söz dizimi kullanılarak da ifade edilebilir. Bu normalde dosyanızda Startup.cs
oluşurConfigureServices()
.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdministratorRole",
policy => policy.RequireRole("Administrator"));
});
}
İlkeler özniteliğindeki Policy
[Authorize]
özelliği kullanılarak uygulanır:
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
return View();
}
Bir gereksinimde izin verilen birden çok rol belirtmek istiyorsanız, bunları yöntemine RequireRole
parametre olarak belirtebilirsiniz:
options.AddPolicy("ElevatedRights", policy =>
policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));
Bu örnek, veya PowerUser
BackupAdministrator
rollerine Administrator
ait olan kullanıcıları yetkiler.
'a Rol hizmetleri ekleme Identity
Rol hizmetlerini eklemek için ekle 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();
}
ASP.NET Core