ASP.NET Core'da talep tabanlı yetkilendirme

Bir kimlik oluşturulduğunda, güvenilir bir taraf tarafından verilen bir veya daha fazla talep atanabilir. Talep, konunun yapabileceklerini değil, öznenin ne olduğunu temsil eden bir ad değer çiftidir. Örneğin, yerel bir ehliyet yetkilisi tarafından verilen bir sürücü belgesine sahip olabilirsiniz. Ehliyetinizde doğum tarihiniz var. Bu durumda talep adı olacaktır DateOfBirth. Talep değeri, örneğin 8th June 1970 doğum tarihiniz, veren ise ehliyet yetkilisi olacaktır. Talep tabanlı yetkilendirme, en basitinde bir talebin değerini denetler ve bu değere göre kaynağa erişime izin verir. Örneğin, bir gece kulübüne erişim istiyorsanız yetkilendirme işlemi şu şekilde olabilir:

Kapı güvenlik görevlisi, size erişim vermeden önce doğum tarihinizin değerini ve verene (ehliyet yetkilisi) güvenip güvenmediğini değerlendirir.

Kimlik, birden çok değer içeren birden çok talep içerebilir ve aynı türde birden çok talep içerebilir.

Talep denetimleri ekleme

Talep 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.

Koddaki talepler, geçerli kullanıcının sahip olması gereken talepleri ve isteğe bağlı olarak istenen kaynağa erişmek için talebin tutması gereken değeri belirtir. Talep gereksinimleri ilke tabanlıdır; geliştiricinin talep gereksinimlerini ifade eden bir ilke oluşturması ve kaydetmesi gerekir.

En basit talep ilkesi türü, bir talebin varlığını arar ve değeri denetlemez.

İlkeyi derleyip kaydedin ve çağrısı yapın UseAuthorization. İlkenin kaydedilmesi, yetkilendirme hizmeti yapılandırmasının bir parçası olarak( genellikle dosyada Program.cs ) gerçekleşir:

var builder = WebApplication.CreateBuilder(args);

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

builder.Services.AddAuthorization(options =>
{
   options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});

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

Bu durumda ilke, EmployeeOnly geçerli kimlikte bir EmployeeNumber talebin varlığını denetler.

İlke adını belirtmek için özniteliğindeki [Authorize] özelliğini kullanarak Policy ilkeyi uygulayın.

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

[Authorize] Özniteliği bir denetleyicinin veya Razor Sayfanın tamamına uygulanabilir; bu durumda yalnızca ilkeyle eşleşen kimliklerin denetleyicideki herhangi bir Eyleme erişmesine izin verilir.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public ActionResult VacationBalance()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
        return View();
    }
}

Aşağıdaki kod özniteliğini bir Razor Sayfaya uygular[Authorize]:

[Authorize(Policy = "EmployeeOnly")]
public class IndexModel : PageModel
{
    public void OnGet()
    {

    }
}

İlkeler Sayfa işleyici düzeyinde uygulanamıyorRazor, Sayfaya uygulanmalıdır.

Özniteliği tarafından [Authorize] korunan ancak belirli eylemlere anonim erişime izin vermek isteyen bir denetleyiciniz varsa özniteliğini AllowAnonymousAttribute uygularsınız.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public ActionResult VacationBalance()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
        return View();
    }
}

İlkeler Sayfa işleyicisi düzeyinde uygulanamadığındanRazor, ilkeler sayfa işleyicisi düzeyinde uygulanması gerektiğinde denetleyici kullanmanızı öneririz. Sayfa işleyicisi düzeyinde ilke Razor gerektirmeyen uygulamanın geri kalanı Sayfalar'ı kullanabilir Razor .

Çoğu talep bir değerle gelir. İlkeyi oluştururken izin verilen değerlerin listesini belirtebilirsiniz. Aşağıdaki örnek yalnızca çalışan numarası 1, 2, 3, 4 veya 5 olan çalışanlar için başarılı olabilir.

var builder = WebApplication.CreateBuilder(args);

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

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("Founders", policy =>
                      policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
});

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

Genel talep denetimi ekleme

Talep değeri tek bir değer değilse veya bir dönüştürme gerekiyorsa kullanın RequireAssertion. Daha fazla bilgi için bkz . İlkeyi yerine getirmek için func kullanma.

Birden Çok İlke Değerlendirmesi

Denetleyici ve eylem düzeylerinde birden çok ilke uygulanırsa, erişim verilmeden önce tüm ilkelerin geçmesi gerekir:

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Payslip()
    {
        return View();
    }

    [Authorize(Policy = "HumanResources")]
    public IActionResult UpdateSalary()
    {
        return View();
    }
}

Yukarıdaki örnekte, ilkeyi EmployeeOnly yerine getiren herhangi bir kimlik, ilke denetleyicide zorlandığından eyleme erişebilir Payslip . Ancak, eylemi çağırmak UpdateSalary için kimliğin hem ilkeyi hem de ilkeyi EmployeeOnly yerine getirmesi HumanResources gerekir.

Doğum talebi tarihi alma, ondan bir yaş hesaplama ve sonra yaş değerinin 21 veya daha büyük olup olmadığını denetleme gibi daha karmaşık ilkeler istiyorsanız, özel ilke işleyicileri yazmanız gerekir.

Aşağıdaki örnekte, her iki sayfa işleyici yöntemi de hem ilkeyi hem de ilkeyi HumanResourcesEmployeeOnly karşılamalıdır:

[Authorize(Policy = "EmployeeOnly")]
[Authorize(Policy = "HumanResources")]
public class SalaryModel : PageModel
{
    public ContentResult OnGetPayStub()
    {
        return Content("OnGetPayStub");
    }

    public ContentResult OnGetSalary()
    {
        return Content("OnGetSalary");
    }
}

Bir kimlik oluşturulduğunda, güvenilir bir taraf tarafından verilen bir veya daha fazla talep atanabilir. Talep, konunun yapabileceklerini değil, öznenin ne olduğunu temsil eden bir ad değer çiftidir. Örneğin, yerel bir ehliyet yetkilisi tarafından verilen bir sürücü belgesine sahip olabilirsiniz. Ehliyetinizde doğum tarihiniz var. Bu durumda talep adı olacaktır DateOfBirth. Talep değeri, örneğin 8th June 1970 doğum tarihiniz, veren ise ehliyet yetkilisi olacaktır. Talep tabanlı yetkilendirme, en basitinde bir talebin değerini denetler ve bu değere göre kaynağa erişime izin verir. Örneğin, bir gece kulübüne erişim istiyorsanız yetkilendirme işlemi şu şekilde olabilir:

Kapı güvenlik görevlisi, size erişim vermeden önce doğum tarihinizin değerini ve verene (ehliyet yetkilisi) güvenip güvenmediğini değerlendirir.

Kimlik, birden çok değer içeren birden çok talep içerebilir ve aynı türde birden çok talep içerebilir.

Talep denetimleri ekleme

Talep tabanlı yetkilendirme denetimleri bildirim temellidir- geliştirici bunları koduna, denetleyiciye veya denetleyici içindeki bir eyleme ekler, geçerli kullanıcının sahip olması gereken talepleri ve isteğe bağlı olarak istenen kaynağa erişmek için talebin tutması gereken değeri belirtir. Talep gereksinimleri ilke tabanlıdır, geliştiricinin talep gereksinimlerini ifade eden bir ilke oluşturması ve kaydetmesi gerekir.

En basit talep ilkesi türü, bir talebin varlığını arar ve değeri denetlemez.

İlkeyi oluşturun ve kaydedin. Bu, normalde dosyanızda Startup.cs yer ConfigureServices() alan Yetkilendirme hizmeti yapılandırmasının bir parçası olarak gerçekleşir.

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

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    });
}

çağrısında UseAuthorization bulunur Configure. Aşağıdaki kod ASP.NET Core web uygulaması şablonları tarafından oluşturulur:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseMigrationsEndPoint();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

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

    app.UseRouting();

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

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Bu durumda ilke, EmployeeOnly geçerli kimlikte bir EmployeeNumber talebin varlığını denetler.

Ardından, ilke adını belirtmek için özniteliğindeki [Authorize] özelliğini kullanarak Policy ilkeyi uygularsınız;

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

Özniteliği denetleyicinin [Authorize] tamamına uygulanabilir, bu örnekte yalnızca ilkeyle eşleşen kimliklerin denetleyicideki herhangi bir Eyleme erişmesine izin verilir.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }
}

Özniteliği tarafından [Authorize] korunan bir denetleyiciniz varsa, ancak belirli eylemlere anonim erişime izin vermek istiyorsanız özniteliğini uygularsınız AllowAnonymousAttribute .

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Çoğu talep bir değerle gelir. İlkeyi oluştururken izin verilen değerlerin listesini belirtebilirsiniz. Aşağıdaki örnek yalnızca çalışan numarası 1, 2, 3, 4 veya 5 olan çalışanlar için başarılı olabilir.

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

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Founders", policy =>
                          policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });
}

Genel talep denetimi ekleme

Talep değeri tek bir değer değilse veya bir dönüştürme gerekiyorsa kullanın RequireAssertion. Daha fazla bilgi için bkz . İlkeyi yerine getirmek için func kullanma.

Birden Çok İlke Değerlendirmesi

Bir denetleyiciye veya eyleme birden çok ilke uygularsanız erişim verilmeden önce tüm ilkelerin geçmesi gerekir. Örnek:

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public ActionResult Payslip()
    {
    }

    [Authorize(Policy = "HumanResources")]
    public ActionResult UpdateSalary()
    {
    }
}

Yukarıdaki örnekte, ilkeyi EmployeeOnly gerçekleştiren herhangi bir kimlik, ilke denetleyicide zorlandığından eyleme erişebilir Payslip . Ancak eylemi çağırmak UpdateSalary için kimliğin hem ilkeyi hem de ilkeyi EmployeeOnly yerine getirmesi HumanResources gerekir.

Doğum talebi tarihi alma, yaş hesaplama gibi daha karmaşık ilkeler istiyorsanız yaş 21 veya daha büyükse, özel ilke işleyicileri yazmanız gerekir.

Bir kimlik oluşturulduğunda, güvenilir bir taraf tarafından verilen bir veya daha fazla talep atanabilir. Talep, konunun yapabileceklerini değil, öznenin ne olduğunu temsil eden bir ad değer çiftidir. Örneğin, yerel bir ehliyet yetkilisi tarafından verilen bir sürücü belgesine sahip olabilirsiniz. Ehliyetinizde doğum tarihiniz var. Bu durumda talep adı olacaktır DateOfBirth. Talep değeri, örneğin 8th June 1970 doğum tarihiniz, veren ise ehliyet yetkilisi olacaktır. Talep tabanlı yetkilendirme, en basitinde bir talebin değerini denetler ve bu değere göre kaynağa erişime izin verir. Örneğin, bir gece kulübüne erişim istiyorsanız yetkilendirme işlemi şu şekilde olabilir:

Kapı güvenlik görevlisi, size erişim vermeden önce doğum tarihinizin değerini ve verene (ehliyet yetkilisi) güvenip güvenmediğini değerlendirir.

Kimlik, birden çok değer içeren birden çok talep içerebilir ve aynı türde birden çok talep içerebilir.

Talep denetimleri ekleme

Talep tabanlı yetkilendirme denetimleri bildirim temellidir- geliştirici bunları koduna, denetleyiciye veya denetleyici içindeki bir eyleme ekler, geçerli kullanıcının sahip olması gereken talepleri ve isteğe bağlı olarak istenen kaynağa erişmek için talebin tutması gereken değeri belirtir. Talep gereksinimleri ilke tabanlıdır, geliştiricinin talep gereksinimlerini ifade eden bir ilke oluşturması ve kaydetmesi gerekir.

En basit talep ilkesi türü, bir talebin varlığını arar ve değeri denetlemez.

İlkeyi oluşturun ve kaydedin. Bu, normalde dosyanızda Startup.cs yer ConfigureServices() alan Yetkilendirme hizmeti yapılandırmasının bir parçası olarak gerçekleşir.

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

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    });
}

Bu durumda ilke, EmployeeOnly geçerli kimlikte bir EmployeeNumber talebin varlığını denetler.

Ardından, ilke adını belirtmek için özniteliğindeki [Authorize] özelliğini kullanarak Policy ilkeyi uygularsınız;

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

Özniteliği denetleyicinin [Authorize] tamamına uygulanabilir, bu örnekte yalnızca ilkeyle eşleşen kimliklerin denetleyicideki herhangi bir Eyleme erişmesine izin verilir.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }
}

Özniteliği tarafından [Authorize] korunan bir denetleyiciniz varsa, ancak belirli eylemlere anonim erişime izin vermek istiyorsanız özniteliğini uygularsınız AllowAnonymousAttribute .

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Çoğu talep bir değerle gelir. İlkeyi oluştururken izin verilen değerlerin listesini belirtebilirsiniz. Aşağıdaki örnek yalnızca çalışan numarası 1, 2, 3, 4 veya 5 olan çalışanlar için başarılı olabilir.

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

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Founders", policy =>
                          policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });
}

Genel talep denetimi ekleme

Talep değeri tek bir değer değilse veya bir dönüştürme gerekiyorsa kullanın RequireAssertion. Daha fazla bilgi için bkz . İlkeyi yerine getirmek için func kullanma.

Birden Çok İlke Değerlendirmesi

Bir denetleyiciye veya eyleme birden çok ilke uygularsanız erişim verilmeden önce tüm ilkelerin geçmesi gerekir. Örnek:

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public ActionResult Payslip()
    {
    }

    [Authorize(Policy = "HumanResources")]
    public ActionResult UpdateSalary()
    {
    }
}

Yukarıdaki örnekte, ilkeyi EmployeeOnly gerçekleştiren herhangi bir kimlik, ilke denetleyicide zorlandığından eyleme erişebilir Payslip . Ancak eylemi çağırmak UpdateSalary için kimliğin hem ilkeyi hem de ilkeyi EmployeeOnly yerine getirmesi HumanResources gerekir.

Doğum talebi tarihi alma, yaş hesaplama gibi daha karmaşık ilkeler istiyorsanız yaş 21 veya daha büyükse, özel ilke işleyicileri yazmanız gerekir.