ASP.NET Core'da rol tabanlı yetkilendirme

Bir kimlik oluşturulduğunda bir 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 IsInRoleClaimsPrincipal sunulur. AddRoles rol hizmetlerine eklenmelidir.

Roller talep olsa da, tüm talepler rol değildir. Kimlik verene bağlı olarak rol, grup üyeleri için talep uygulayabilecek bir kullanıcı koleksiyonu ve kimlik üzerinde gerçek bir talep 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.Identitybir 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ün PowerUser üyeleri denetleyiciye ve eyleme SetTime erişebilir.
  • Eyleme Administrator yalnızca rolün ShutDown üyeleri erişebilir.

Bir denetleyici kilitlenebilir 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ğine PageModel uygulama:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public IActionResult OnPost() =>
         Content("OnPost RequireAdministratorRole");
}

Önemli

dahil olmak üzere AuthorizeAttributefiltre ö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 Administratorait olan kullanıcıları yetkiler.

Bir kimlik oluşturulduğunda bir veya daha fazla role ait olabilir. Örneğin, Tracy Yönetici istrator ve User 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 IsInRoleClaimsPrincipal 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ün PowerUser üyeleri denetleyiciye ve eyleme SetTime erişebilir.
  • Eyleme Administrator yalnızca rolün ShutDown ü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ğine PageModel uygulama:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

Önemli

dahil olmak üzere AuthorizeAttributefiltre ö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 PowerUserBackupAdministrator rollerine Administratorait 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();
}