ASP.NET Core'da talep tabanlı yetkilendirme
identity Oluşturulduğunda, güvenilen 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.
birden identity ç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 durumdaEmployeeOnly
, ilke geçerli identityüzerinde 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. rest Sayfa işleyici düzeyinde ilke Razor gerektirmeyen uygulamanın Sayfaları kullanabilirRazor.
Ç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
gerçekleştiren herhangi biriidentity, ilke denetleyicide zorlandığından eyleme erişebilirPayslip
. Ancak, eylemi çağırmak UpdateSalary
için hem ilkeyi hem de ilkeyi EmployeeOnly
yerine getirmesi HumanResources
gerekir.identity
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 HumanResources
EmployeeOnly
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");
}
}
identity Oluşturulduğunda, güvenilen 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.
birden identity ç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 durumdaEmployeeOnly
, ilke geçerli identityüzerinde 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. Örneğin:
[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 biriidentity, ilke denetleyicide zorlandığından eyleme erişebilirPayslip
. Ancak eylemi çağırmak UpdateSalary
için hem ilkeyi hem de ilkeyi EmployeeOnly
yerine getirmesi HumanResources
gerekir.identity
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.
identity Oluşturulduğunda, güvenilen 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.
birden identity ç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 durumdaEmployeeOnly
, ilke geçerli identityüzerinde 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. Örneğin:
[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 biriidentity, ilke denetleyicide zorlandığından eyleme erişebilirPayslip
. Ancak eylemi çağırmak UpdateSalary
için hem ilkeyi hem de ilkeyi EmployeeOnly
yerine getirmesi HumanResources
gerekir.identity
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.
ASP.NET Core