.NET mikro hizmet ve web uygulamalarında yetkilendirme hakkında
İpucu
Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi e-Kitabı'ndan bir alıntıdır.
Kimlik doğrulamasının ardından ASP.NET Core Web API'lerinin erişimi yetkilendirmesi gerekir. Bu işlem, bir hizmetin API'leri bazı kimliği doğrulanmış kullanıcılar için kullanılabilir hale getirmesine olanak tanır, ancak tümü için kullanılamaz. Yetkilendirme , kullanıcıların rollerine göre veya talepleri veya diğer buluşsal yöntemleri incelemeyi içerebilen özel ilkeye göre yapılabilir.
ASP.NET Core MVC yoluna erişimi kısıtlamak, aşağıdaki örnekte gösterildiği gibi eylem yöntemine (veya denetleyicinin tüm eylemleri yetkilendirme gerektiriyorsa denetleyicinin sınıfına) Yetkilendirme özniteliği uygulamak kadar kolaydır:
public class AccountController : Controller
{
public ActionResult Login()
{
}
[Authorize]
public ActionResult Logout()
{
}
}
Varsayılan olarak, parametresiz bir Authorize özniteliği eklemek, bu denetleyici veya eylem için kimliği doğrulanmış kullanıcılara erişimi sınırlandıracaktır. Bir API'yi yalnızca belirli kullanıcılar için kullanılabilir olacak şekilde daha fazla kısıtlamak için özniteliği, kullanıcıların karşılaması gereken gerekli rolleri veya ilkeleri belirtecek şekilde genişletilebilir.
Rol tabanlı yetkilendirme uygulama
ASP.NET Core Identity'in yerleşik bir rol kavramı vardır. kullanıcılara ek olarak, ASP.NET Core Identity uygulama tarafından kullanılan farklı roller hakkındaki bilgileri depolar ve hangi kullanıcıların hangi rollere atandığı izler. Bu atamalar, kalıcı depolamadaki rolleri güncelleştiren tür ve UserManager
kullanıcılardan rol verebilen veya iptal eden türle RoleManager
program aracılığıyla değiştirilebilir.
JWT taşıyıcı belirteçleriyle kimlik doğrulaması yaparsanız ASP.NET Core JWT taşıyıcı kimlik doğrulaması ara yazılımı, belirteçte bulunan rol taleplerine göre kullanıcının rollerini doldurur. Bir MVC eylemine veya denetleyicisine erişimi belirli rollerdeki kullanıcılarla sınırlamak için, aşağıdaki kod parçasında gösterildiği gibi Yetkilendirme ek açıklamasına (öznitelik) bir Roller parametresi ekleyebilirsiniz:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
public ActionResult SetTime()
{
}
[Authorize(Roles = "Administrator")]
public ActionResult ShutDown()
{
}
}
Bu örnekte yalnızca Yönetici istrator veya PowerUser rollerindeki kullanıcılar ControlPanel denetleyicisindeki API'lere erişebilir (SetTime eylemini yürütme gibi). ShutDown API'sini yalnızca Yönetici istrator rolündeki kullanıcılara erişim izni verecek şekilde kısıtlanmıştır.
Bir kullanıcının birden çok rolde olmasını istemek için, aşağıdaki örnekte gösterildiği gibi birden çok Yetkilendirme özniteliği kullanırsınız:
[Authorize(Roles = "Administrator, PowerUser")]
[Authorize(Roles = "RemoteEmployee ")]
[Authorize(Policy = "CustomPolicy")]
public ActionResult API1 ()
{
}
Bu örnekte, API1'i çağırmak için kullanıcının şunları yapması gerekir:
Yönetici istrator veya PowerUser rolünde olun ve
RemoteEmployee rolünde olun ve
CustomPolicy yetkilendirmesi için özel bir işleyiciyi karşılar.
İlke tabanlı yetkilendirme uygulama
Özel yetkilendirme kuralları, yetkilendirme ilkeleri kullanılarak da yazılabilir. Bu bölümde genel bir bakış sağlanır. Daha fazla bilgi için bkz . ASP.NET Yetkilendirme Atölyesi.
Özel yetkilendirme ilkeleri, hizmeti kullanılarak Startup.ConfigureServices yöntemine kaydedilir. AddAuthorization yöntemi. Bu yöntem, AuthorizationOptions bağımsız değişkenlerini yapılandıran bir temsilci alır.
services.AddAuthorization(options =>
{
options.AddPolicy("AdministratorsOnly", policy =>
policy.RequireRole("Administrator"));
options.AddPolicy("EmployeesOnly", policy =>
policy.RequireClaim("EmployeeNumber"));
options.AddPolicy("Over21", policy =>
policy.Requirements.Add(new MinimumAgeRequirement(21)));
});
Örnekte gösterildiği gibi, ilkeler farklı türlerdeki gereksinimlerle ilişkilendirilebilir. İlkeler kaydedildikten sonra, ilkenin adını Authorize özniteliğinin İlke bağımsız değişkeni (örneğin, ) olarak geçirerek bir eyleme veya denetleyiciye uygulanabilirler ( örneğin, [Authorize(Policy="EmployeesOnly")]
) İlkeler yalnızca bir gereksinime sahip olabilir (bu örneklerde gösterildiği gibi).
Önceki örnekte, ilk AddPolicy çağrısı role göre yetkilendirmenin alternatif bir yoludur. BIR API'ye uygulanırsa[Authorize(Policy="AdministratorsOnly")]
, yalnızca Yönetici istrator rolündeki kullanıcılar api'ye erişebilir.
İkinci AddPolicy çağrı, kullanıcı için belirli bir talebin mevcut olmasını gerektirmenin kolay bir yolunu gösterir. RequireClaim Yöntemi isteğe bağlı olarak talep için beklenen değerleri de alır. Değerler belirtilirse, gereksinim yalnızca kullanıcının hem doğru türde hem de belirtilen değerlerden birine sahip olması durumunda karşılanır. JWT taşıyıcı kimlik doğrulama ara yazılımını kullanıyorsanız, tüm JWT özellikleri kullanıcı talepleri olarak kullanılabilir.
Burada gösterilen en ilginç ilke, özel yetkilendirme gereksinimi kullandığından üçüncü AddPolicy
yöntemdir. Özel yetkilendirme gereksinimlerini kullanarak, yetkilendirmenin nasıl gerçekleştirildiği üzerinde çok fazla denetime sahip olabilirsiniz. Bunun çalışması için şu türleri uygulamanız gerekir:
ve türünden IAuthorizationRequirement türetilen ve gereksinimin ayrıntılarını belirten alanları içeren bir Gereksinimler türü. Örnekte, bu örnek
MinimumAgeRequirement
türü için bir yaş alanıdır.uygulayan AuthorizationHandler<TRequirement>bir işleyici, burada T, işleyicinin IAuthorizationRequirement karşılayabileceğiniz türüdür. İşleyici, kullanıcı hakkında bilgi içeren belirtilen bir bağlamın HandleRequirementAsync gereksinimi karşılayıp sağlamadığını denetleyen yöntemini uygulamalıdır.
Kullanıcı gereksinimi karşılıyorsa, çağrısı context.Succeed
kullanıcının yetkili olduğunu gösterir. Kullanıcının yetkilendirme gereksinimini karşılamanın birden çok yolu varsa, birden çok işleyici oluşturulabilir.
Özel ilke gereksinimlerini çağrılara AddPolicy
kaydetmeye ek olarak, Bağımlılık Ekleme ()services.AddTransient<IAuthorizationHandler, MinimumAgeHandler>()
aracılığıyla özel gereksinim işleyicilerini de kaydetmeniz gerekir.
Kullanıcının yaşını denetlemeye yönelik özel yetkilendirme gereksinimi ve işleyici örneği (talep DateOfBirth
temelinde) ASP.NET Core yetkilendirme belgelerinde bulunabilir.
Yetkilendirme ve minimum api'ler
ASP.NET, denetleyici tabanlı API'lere alternatif olarak en düşük API'leri destekler. Yetkilendirme ilkeleri, aşağıdaki örnekte gösterildiği gibi minimum API'ler için yetkilendirmeyi yapılandırmanın önerilen yoludur:
// Program.cs
builder.Services.AddAuthorizationBuilder()
.AddPolicy("admin_greetings", policy =>
policy
.RequireRole("admin")
.RequireScope("greetings_api"));
// build the app
app.MapGet("/hello", () => "Hello world!")
.RequireAuthorization("admin_greetings");
Ek kaynaklar
ASP.NET Çekirdek Kimlik Doğrulaması
https://learn.microsoft.com/aspnet/core/security/authentication/identityASP.NET Çekirdek Yetkilendirme
https://learn.microsoft.com/aspnet/core/security/authorization/introductionRol Tabanlı Yetkilendirme
https://learn.microsoft.com/aspnet/core/security/authorization/rolesÖzel İlke Tabanlı Yetkilendirme
https://learn.microsoft.com/aspnet/core/security/authorization/policiesMinimum API'lerde kimlik doğrulaması ve yetkilendirme \ https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis/security