Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kimlik doğrulamasından sonra bir kullanıcının kimliği oluşturulduğunda, kullanıcı verilere erişmek ve işlemler gerçekleştirmek için sahip olduğu çeşitli yetkilendirmeleri yansıtan bir veya daha fazla role ait olabilir. Örneğin, Tracy uygulamadaki yönetim web sayfalarına erişimi olan "Yönetici" ve "Kullanıcı" rollerine aitken, Scott yalnızca "Kullanıcı" rolüne ait olabilir ve yönetim verilerine veya işlemlerine erişimi olmayabilir. Bu rollerin nasıl oluşturulduğu ve yönetilme şekli yetkilendirme işleminin yedekleme deposuna bağlıdır. Roller ClaimsPrincipal.IsInRole aracılığıyla geliştiriciye sunulur. AddRoles uygulamanın kimlik sistemi ayarlanırken Rol hizmetleri eklemek için çağrılmalıdır.
Roller talep olsa da, tüm talepler rol değildir. Kimlik veren kuruluşa bağlı olarak, bir rol, grup üyeleri için talepler uygulayabilecek bir kullanıcı koleksiyonu olabilir ve ayrıca kimlik üzerinde gerçek bir talep de 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, tek sayfalı uygulama (SPA) şablonlarının roller etrafında tasarlanmamış olmasının nedenidir. Buna ek olarak, yerinde eski bir sistemden geçiş yapan kuruluşlarda rollerin yıllar içinde yaygınlaşması, rol iddiasının bir SPA tarafından kullanılabilecek bir belirteç içinde barındırılamayacak kadar büyük olabileceği anlamına gelebilir. SPA'ların güvenliğini sağlamak için bkz SPAlar için bir Web API arka ucunun güvenliğini sağlamak için Identity kullanma.
Bu makale, bileşen örneklerini kullanır Razor ve yetkilendirme senaryolarına odaklanır Blazor . Blazor Ek yönergeler için Ek kaynaklar bölümüne bakın. Razor Sayfalar ve MVC kılavuzu için aşağıdaki kaynaklara bakın:
- Role tabanlı yetkilendirme, ASP.NET Core
Sayfaları 'nda - ASP.NET Core MVC'de Rol Tabanlı Yetkilendirme
Identity yapılandırması, .NET 6 sürümüyle değiştirildi. Bu makaledeki örnekler, uygulamanın Identity dosyasında Program hizmetlerini yapılandıran yaklaşımlar göstermektedir. .NET 6'nın yayımlanmasından önceki .NET uygulamaları için (ve Blazor Web Apps .NET 8 ile yayımlanmadan önce), hizmetler Startup.ConfigureServices dosyasının Startup.cs içinde yapılandırılır. Yapılandırma sözdizimi, ilgili Identity ve Razor gösterilir. Önceki kaynaklara bakın ve makale sürümü seçicisini uygulamanızın hedeflediği .NET sürümüne ayarlayın.
Örnek uygulama
Bu makalenin Blazor Web App örneği, BlazorWebAppAuthorization örnek uygulamadır (dotnet/AspNetCore.Docs.Samples GitHub deposu) (nasıl indirileceği). Örnek uygulama, bu makaledeki örneklerin çoğunu göstermek için önceden yapılandırılmış rollere sahip dağıtılmış hesapları kullanır. Daha fazla bilgi için örneğin README dosyasına (README.md) bakın.
Dikkat
Bu örnek uygulama, üretim senaryoları için uygun olmayan kullanıcı bilgilerini depolamak için bellek içi bir veritabanı kullanır. Örnek uygulama yalnızca tanıtım amaçlıdır ve üretim uygulamaları için başlangıç noktası olarak kullanılmamalıdır.
'a Rol hizmetleri ekleme Identity
Uygulamanın Program yapılandırmasında AddRoles'i rol türü ile çağırarak, Identity dosyasına rol tabanlı yetkilendirme hizmetlerini kaydedin. Aşağıdaki örnekteki rol türü:IdentityRole
builder.Services.AddDefaultIdentity<IdentityUser>( ... )
.AddRoles<IdentityRole>()
...
Yukarıdaki kod için Microsoft.AspNetCore.Identity.UI NuGet paketi ve using için Microsoft.AspNetCore.Identity yönergesi gerekir.
Uygulamanın Identity el ile oluşturulmasını ayrıntılı bir şekilde kontrol ettiği durumlarda, AddRoles öğesini AddIdentityCore üzerinde çağırın.
builder.Services.AddIdentityCore<IdentityUser>()
.AddRoles<IdentityRole>()
...
Role türünü uygulamanın Startup.ConfigureServices yapılandırmasında Startup.cs çağırarak AddRoles (Identity) içindeki rol tabanlı yetkilendirme hizmetlerini kaydedin. Aşağıdaki örnekteki rol türü:IdentityRole
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
...
Yukarıdaki kod için Microsoft.AspNetCore.Identity.UI NuGet paketi ve using için Microsoft.AspNetCore.Identity yönergesi gerekir.
Uygulamanın Identity el ile oluşturulmasını ayrıntılı bir şekilde kontrol ettiği durumlarda, AddRoles öğesini AddIdentityCore üzerinde çağırın.
services.AddIdentityCore<IdentityUser>()
.AddRoles<IdentityRole>()
...
Blazor Web Apps(.NET 8 veya üzeri) içinde, UseAuthorization dosyasında Program çağrılması gerekmez.
Blazor Server uygulamalarında, UseAuthorization öğesini Program dosyasında UseAuthentication satırını (varsa) çağırdıktan sonra çağırın.
app.UseAuthentication(); // Only present if not called internally
app.UseAuthorization();
Blazor Server uygulamalarında ( Blazor Web App değil), UseAuthorization'yi UseAuthentication'yi çağıran satırdan sonra Program dosyasında çağırın (varsa):
app.UseAuthentication(); // Only present if not called internally
app.UseAuthorization();
Blazor Server uygulamalarında (Blazor Web App değil), UseAuthentication çağrısından sonra (Startup.cs) UseAuthorization ifadesini Startup.Configure içinde çağırın (eğer varsa):
app.UseAuthentication(); // Only present if not called internally
app.UseAuthorization();
Blazor WebAssembly uygulamalar, yetkilendirme hizmetleri eklemek için AddAuthorizationCoreProgram dosyasındaki fonksiyonu çağırır:
builder.Services.AddAuthorizationCore();
Rol tabanlı yetkilendirme denetimleri
Rol tabanlı yetkilendirme denetimleri:
- Deklaratiftir ve istenen kaynağa erişmek için geçerli kullanıcının üyesi olması gereken rolleri belirtir.
- Bileşenlere (bu makaledeki örnekler), RazorRazor veya MVC denetleyicilerine veya denetleyici içindeki eylemlere uygulanır.
Bileşen AuthorizeView (AuthorizeView belgelerdeki Blazor bileşen) rol tabanlı yetkilendirmeyi destekler. Bu bölüm temel kavramları kapsar. Tam kapsam için bkz. ASP.NET Core Blazor kimlik doğrulaması ve yetkilendirme.
Bileşenlerdeki Razor içeriğin rol tabanlı yetkilendirmesi için parametresini AuthorizeView.Roles kullanın.
Aşağıdaki örnekte:
- Kullanıcının ilk
Adminbileşeninin içeriğini görmek için yaSuperUserya da AuthorizeView rolüyle ilgili bir iddiaya sahip olması gerekir. - Hem
Adminhem deSuperUserrol iddialarını gerektirmek için, ikinci örnek AuthorizeView bileşenlerini iç içe yerleştirmektedir.
Pages/RoleChecksWithAuthorizeView.razor:
@page "/role-checks-with-authorizeview"
<h3>Role Checks with AuthorizeView</h3>
<AuthorizeView Roles="Admin, SuperUser">
<p>User: @context.User.Identity?.Name</p>
<p>You have an 'Admin' or 'SuperUser' role claim.</p>
</AuthorizeView>
<AuthorizeView Roles="Admin">
<p>User: @context.User.Identity?.Name</p>
<p>You have the 'Admin' role claim.</p>
<AuthorizeView Roles="SuperUser" Context="innerContext">
<p>User: @innerContext.User.Identity?.Name</p>
<p>You have both 'Admin' and 'SuperUser' role claims.</p>
</AuthorizeView>
</AuthorizeView>
Önceki kod, bir bağlam çakışmasını önlemek için iç Context bileşeni için bir AuthorizeView kurar. Dış AuthenticationState bağlamına AuthorizeView ve standart bağlama erişim yaklaşımı (@context.User) ile erişilir. İsimlendirilmiş AuthorizeView bağlamı (innerContext) ile içte bulunan @innerContext.User'da bağlama erişilir.
özniteliği tüm [Authorize] bileşenler için Razor rol tabanlı yetkilendirmeyi destekler. parametresini AuthorizeAttribute.Roles kullanın. Aşağıdaki kod, bileşen erişimini Admin rolünün üyesi olan kullanıcılarla sınırlar.
Pages/RequireAdminRoleWithAuthorizeAttribute.razor:
@page "/require-admin-role-with-authorize-attribute"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin")]
<h1>Require 'Admin' role with [Authorize] attribute</h1>
<p>You can only see this if you're in the 'Admin' role.</p>
Birden çok rol virgülle ayrılmış liste olarak belirtilebilir. Aşağıdaki örnekte, erişim, Admin rolü veya rolünün üyesi olan kullanıcılara sınırlıdır.
Pages/RequireAdminOrSuperUserRoleWithAuthorizeAttribute.razor:
@page "/require-admin-or-superuser-role-with-authorize-attribute"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin, SuperUser")]
<h1>Require 'Admin' or 'SuperUser' role with [Authorize] attribute</h1>
<p>
You can only see this if you're in the 'Admin' role or the 'SuperUser' role.
</p>
Birden çok öznitelik uygulandığında, kullanıcı belirtilen tüm rollerin üyesi olmalıdır. Aşağıdaki örnek hem hem deAdminSuperUser.
Pages/RequireAdminAndSuperUserRolesWithAuthorizeAttributes.razor:
@page "/require-admin-and-superuser-roles-with-authorize-attributes"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin")]
@attribute [Authorize(Roles = "SuperUser")]
<h1>Require 'Admin' and 'SuperUser' roles with [Authorize] attributes</h1>
<p>
You can only see this if you're in both the 'Admin' role
and the 'SuperUser' role.
</p>
Rol eşleştirme genellikle büyük/küçük harfe duyarlıdır çünkü rol adları .NET dize karşılaştırmaları kullanılarak depolanır ve karşılaştırılır. Örneğin, Admin (büyük harf A) ile admin (küçük harf a) aynı rol olarak değerlendirilmez. Daha fazla bilgi için bkz. ASP.NET Core içinde talep tabanlı yetkilendirme.
İlke tabanlı yetkilendirme denetimleri
Rol gereksinimleri, uygulamanın Yetkilendirme hizmeti yapılandırmasının bir parçası olarak başlangıçta bir ilkeyi kaydettirdiği ilke söz dizimi kullanılarak ifade edilebilir.
Aşağıdaki örnekte:
-
RequireAdminRoleilkesi, kullanıcılarınAdminrolünde olması gerektiğini belirtir. -
RequireSuperUserRoleilkesi, kullanıcılarınSuperUserrolünde olması gerektiğini belirtir.
builder.Services.AddAuthorizationBuilder()
.AddPolicy("RequireAdminRole",
policy => policy.RequireRole("Admin"))
.AddPolicy("RequireSuperUserRole",
policy => policy.RequireRole("SuperUser"));
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdminRole",
policy => policy.RequireRole("Admin"));
options.AddPolicy("RequireSuperUserRole",
policy => policy.RequireRole("SuperUser"));
});
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdminRole",
policy => policy.RequireRole("Admin"));
options.AddPolicy("RequireSuperUserRole",
policy => policy.RequireRole("SuperUser"));
});
Bir AuthorizeView bileşeni kullanarak ilke tabanlı yetkilendirme yapmak için tek bir ilke adıyla AuthorizeView.Policy parametresini kullanın.
Pages/PassRequireAdminRolePolicy.razor:
@page "/pass-requireadminrole-policy-with-authorizeview"
<h1>Pass 'RequireAdminRole' policy with AuthorizeView</h1>
<AuthorizeView Policy="RequireAdminRole">
<p>You satisfy the 'RequireAdminRole' policy.</p>
</AuthorizeView>
Kullanıcının çeşitli ilkelerden birini karşılaması gereken durumu işlemek için, kullanıcının diğer ilkeleri karşıladığını onaylayan bir ilke oluşturun.
Kullanıcının aynı anda birkaç ilkeyi karşılaması gereken durumu işlemek için aşağıdaki yaklaşımlardan birini uygulayın:
Kullanıcının diğer birkaç ilkeyi karşıladığını doğrulayan bir politika AuthorizeView oluşturun.
İlkeleri birden çok AuthorizeView bileşene iç içe yerleştirin.
Pages/PassRequireAdminRoleAndRequireSuperUserRolePoliciesWithAuthorizeViews.razor:@page "/pass-requireadminrole-and-requiresuperuserrole-policies-with-authorizeviews" <h1> Pass 'RequireAdminRole' and 'RequireSuperUserRole' policies with AuthorizeViews </h1> <AuthorizeView Policy="RequireAdminRole"> <AuthorizeView Policy="RequireSuperUserRole" Context="innerContext"> <p> You satisfy the 'RequireAdminRole' and 'RequireSuperUserRole' policies. </p> </AuthorizeView> </AuthorizeView>
Her iki Roles ve Policy ayarlandığında, yetkilendirme yalnızca her iki koşul da karşılandığında başarılı olur. Başka bir ifadeyle, kullanıcının belirtilen rollerden en az birine ait olması ve ilke tarafından tanımlanan gereksinimleri karşılaması gerekir.
Ne Roles ne de Policy belirtilirse, AuthorizeView varsayılan politikayı kullanır:
- Kimliği doğrulanmış (oturum açmış) kullanıcılar yetkilendirilir.
- Kimliği doğrulanmamış (oturum kapatılmış) kullanıcılar yetkisizdir.
Genellikle büyük/küçük harfe duyarlı olan rol eşleştirmenin aksine, ASP.NET Core ilke adı araması genellikle büyük/küçük harfe duyarlı değildir; bu nedenle RequireAdminRole ve requireadminrole aynı ilkeye başvurur.
Tüm Razor bileşene, Policy kullanılarak ilkeler uygulanır.
Pages/PassRequireAdminRolePolicyWithAuthorizeAttribute.razor:
@page "/pass-requireadminrole-policy-with-authorize-attribute"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy = "RequireAdminRole")]
<h1>Pass RequireAdminRole policy with [Authorize] attribute</h1>
<p>You can only see this if the 'RequireAdminRole' policy is satisfied.</p>
Bir gereksinimde izin verilen birden çok rol belirtmek için, rolleri yöntemine RequireRole parametre olarak belirtin. Aşağıdaki örnekte, Admin rollerine SuperUser ait olmaları durumunda kullanıcılar yetkilendirilmiştir:
builder.Services.AddAuthorizationBuilder()
.AddPolicy("ElevatedRights", policy =>
policy.RequireRole("Admin", "SuperUser"));
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("ElevatedRights", policy =>
policy.RequireRole("Admin", "SuperUser"));
});
services.AddAuthorization(options =>
{
options.AddPolicy("ElevatedRights", policy =>
policy.RequireRole("Admin", "SuperUser"));
});
İlkenin önceki rollerin tümünü gerektirmesini istiyorsanız, rolleri ya ilke oluşturucuya zincirleyin ya da her birini lambda deyimi kullanarak ilke oluşturucuda ayrı ayrı belirtin.
Politika oluşturucuya bağımlı olma:
builder.Services.AddAuthorizationBuilder()
.AddPolicy("ElevatedRights", policy =>
policy
.RequireRole("Admin")
.RequireRole("SuperUser"));
Alternatif olarak lambda deyimini de kullanabilirsiniz:
builder.Services.AddAuthorizationBuilder()
.AddPolicy("ElevatedRights",
policy =>
{
policy.RequireRole("Admin");
policy.RequireRole("SuperUser");
});
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("ElevatedRights", policy =>
policy
.RequireRole("Admin")
.RequireRole("SuperUser"));
});
Alternatif olarak lambda deyimini de kullanabilirsiniz:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("ElevatedRights",
policy =>
{
policy.RequireRole("Admin");
policy.RequireRole("SuperUser");
});
});
services.AddAuthorization(options =>
{
options.AddPolicy("ElevatedRights", policy =>
policy
.RequireRole("Admin")
.RequireRole("SuperUser"));
});
Alternatif olarak lambda deyimini de kullanabilirsiniz:
services.AddAuthorization(options =>
{
options.AddPolicy("ElevatedRights",
policy =>
{
policy.RequireRole("Admin");
policy.RequireRole("SuperUser");
});
});
Windows Kimlik Doğrulama güvenlik gruplarını uygulama rolleri olarak kullanma
Uygulama Windows Kimlik Doğrulaması için yapılandırıldıktan sonra (Blazor-e özgü rehberlik) istemci ve sunucu makinelerinin aynı Windows etki alanında olduğu durumda, kullanıcı güvenlik grupları otomatik olarak kullanıcının ClaimsPrincipal unsurlarına talep olarak eklenir.
Uygulama, istemci ve sunucu makinelerinin aynı Windows etki alanının bir parçası olduğu Windows Kimlik Doğrulaması için yapılandırıldığında, kullanıcı güvenlik grupları otomatik olarak kullanıcının ClaimsPrincipal'ine talepler olarak dahil edilir.
User.Identity genellikle Windows Kimlik Doğrulaması kullanıldığında bir WindowsIdentity olur ve SID grubu iddialarını alabilir veya aşağıdaki kodla bir kullanıcının bir rolde olup olmadığını denetleyebilirsiniz: burada {DOMAIN} yer tutucusu etki alanı ve {SID GROUP NAME} SID grubu adıdır.
if (User.Identity is WindowsIdentity windowsIdentity)
{
var groups = windowsIdentity.Groups;
// If needed, obtain a list of the SID groups
var securityGroups =
groups.Select(g => g.Translate(typeof(NTAccount)).ToString()).ToList();
// If needed, obtain the user's Windows identity name
var windowsIdentityName = windowsIdentity.Name;
// Check if the user is in a specific SID group
if (User.IsInRole(@"{DOMAIN}\{SID GROUP NAME}"))
{
// User is in the specified group
}
else
{
// User isn't in the specified group
}
}
else
{
// The user isn't authenticated with Windows Authentication
}
`Blazor uygulamasında, SID grup taleplerini insan tarafından okunabilir değerlere çeviren ilgili kodun tanıtımı için, Windows Authentication ile ASP.NET Core Blazor Web App Güvenli Hale Getirme yönergesindeki UserClaims bileşenine bakın.` SID grubu taleplerini alma yaklaşımı, bir kullanıcının kimliği doğrulandığında özel rol talepleri oluşturmak için ile talep ekleme ile IClaimsTransformation birleştirilebilir.
SID grubu taleplerini almak için önceki örneğe benzer bir yaklaşım, kullanıcının kimliği doğrulandığında özel rol talepleri oluşturmak için ile talep ekleme ile IClaimsTransformation birleştirilebilir.
Ek kaynaklar
- ASP.NET Core Blazor kimlik doğrulaması ve yetkilendirme
- Microsoft Entra ID grupları ve rolleri ile ASP.NET Core Blazor WebAssembly
- Role tabanlı yetkilendirme
ASP.NET Core Sayfaları'nda - ASP.NET Core MVC'de Rol tabanlı yetkilendirme
-
Kullanarak rol talepleri de dahil olmak üzere özel talepleri genişletme veya ekleme
IClaimsTransformation
ASP.NET Core