Rolleri Oluşturma ve Yönetme (C#)
tarafından Scott Mitchell
Not
Bu makale yazıldığından beri, ASP.NET Üyelik sağlayıcılarının yerini ASP.NET Identity alır. Bu makalenin yazıldığı sırada öne çıkan Üyelik sağlayıcıları yerine ASP.NET Kimlik platformunu kullanmak için uygulamaları güncelleştirmenizi kesinlikle öneririz. ASP.NET Identity, ASP.NET Üyelik sistemine göre aşağıdakiler dahil olmak üzere çeşitli avantajlara sahiptir:
- Daha iyi performans
- Geliştirilmiş genişletilebilirlik ve test edilebilirlik
- OAuth, OpenID Connect ve iki öğeli kimlik doğrulaması desteği
- Talep Tabanlı Kimlik desteği
- ASP.Net Core ile daha iyi birlikte çalışabilirlik
Kodu İndir veya PDF İndir
Bu öğreticide Roller çerçevesini yapılandırmak için gereken adımlar incelenir. Bundan sonra, rolleri oluşturmak ve silmek için web sayfaları oluşturacağız.
Giriş
Kullanıcı Tabanlı Yetkilendirme öğreticisinde, belirli kullanıcıları bir sayfa kümesinden kısıtlamak için URL yetkilendirmesini kullanmayı inceledik ve ziyaret eden kullanıcıya göre bir ASP.NET sayfasının işlevselliğini ayarlamak için bildirim temelli ve programlı teknikleri keşfettik. Ancak, sayfa erişimi veya işlevselliğine kullanıcı bazında izin verilmesi, çok sayıda kullanıcı hesabının bulunduğu veya kullanıcıların ayrıcalıklarının sık değiştiği senaryolarda bakım kabusu haline gelebilir. Bir kullanıcı belirli bir görevi gerçekleştirmek için yetkilendirme kazandığında veya kaybettiğinde, yöneticinin uygun URL yetkilendirme kurallarını, bildirim temelli işaretlemeyi ve kodu güncelleştirmesi gerekir.
Genellikle kullanıcıları gruplara veya rollere sınıflandırmaya ve ardından izinleri rol temelinde uygulamaya yardımcı olur. Örneğin, çoğu web uygulamasının yalnızca yönetim kullanıcıları için ayrılmış belirli bir sayfa veya görev kümesi vardır. Kullanıcı Tabanlı Yetkilendirme öğreticisinde öğrenilen teknikleri kullanarak, belirtilen kullanıcı hesaplarının yönetim görevlerini gerçekleştirmesine izin vermek için uygun URL yetkilendirme kurallarını, bildirim temelli işaretlemeyi ve kodu ekleriz. Ancak yeni bir yönetici eklendiyse veya mevcut bir yöneticinin yönetim haklarının iptal edilmiş olması gerekiyorsa, yapılandırma dosyalarını ve web sayfalarını geri döndürmemiz ve güncelleştirmemiz gerekir. Ancak rollerle Yöneticiler adlı bir rol oluşturabilir ve bu güvenilen kullanıcıları Yöneticiler rolüne atayabiliriz. Ardından, Yöneticiler rolünün çeşitli yönetim görevlerini gerçekleştirmesine izin vermek için uygun URL yetkilendirme kurallarını, bildirim temelli işaretlemeyi ve kodu ekleyeceğiz. Bu altyapı mevcut olduğunda, siteye yeni yöneticiler eklemek veya mevcut yöneticileri kaldırmak, kullanıcıyı Yöneticiler rolüne eklemek veya kaldırmak kadar kolaydır. Yapılandırma, bildirim temelli işaretleme veya kod değişikliği gerekmez.
ASP.NET rolleri tanımlamak ve kullanıcı hesaplarıyla ilişkilendirmek için bir Roller çerçevesi sunar. Roller çerçevesi ile rolleri oluşturabilir ve silebilir, bir role kullanıcı ekleyebilir veya rolden kullanıcı kaldırabilir, belirli bir role ait olan kullanıcı kümesini belirleyebilir ve bir kullanıcının belirli bir role ait olup olmadığını söyleyebiliriz. Roller çerçevesi yapılandırıldıktan sonra, URL yetkilendirme kuralları aracılığıyla sayfalara erişimi rol bazında sınırlandırabilir ve şu anda oturum açmış olan kullanıcının rollerine göre bir sayfada ek bilgileri veya işlevleri gösterebilir veya gizleyebiliriz.
Bu öğreticide Roller çerçevesini yapılandırmak için gereken adımlar incelenir. Bundan sonra, rolleri oluşturmak ve silmek için web sayfaları oluşturacağız. Kullanıcılara Rol Atama öğreticisinde kullanıcı ekleme ve rollerden kaldırma işlemini inceleyeceğiz. Rol Tabanlı Yetkilendirme öğreticisinde, sayfalara erişimi rol temelinde sınırlamanın yanı sıra ziyaret eden kullanıcının rolüne bağlı olarak sayfa işlevselliğini ayarlamayı da göreceğiz. Haydi başlayalım!
1. Adım: Yeni ASP.NET Sayfaları Ekleme
Bu öğreticide ve sonraki iki adımda rollerle ilgili çeşitli işlevleri ve özellikleri inceleyeceğiz. Bu öğreticilerde incelenen konuları uygulamak için bir dizi ASP.NET sayfaya ihtiyacımız olacak. Şimdi bu sayfaları oluşturalım ve site haritasını güncelleştirelim.
Projede adlı Roles
yeni bir klasör oluşturarak başlayın. Ardından klasöre dört yeni ASP.NET sayfası Roles
ekleyin ve her sayfayı ana sayfaya Site.master
bağlayın. Sayfaları adlandırın:
ManageRoles.aspx
UsersAndRoles.aspx
CreateUserWizardWithRoles.aspx
RoleBasedAuthorization.aspx
Bu noktada projenizin Çözüm Gezgini Şekil 1'de gösterilen ekran görüntüsüne benzer olmalıdır.
Şekil 1: Klasöre Roles
Dört Yeni Sayfa Eklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu noktada her sayfada, ana sayfanın ContentPlaceHolders'ı için bir tane olmak üzere iki İçerik denetimi olmalıdır: MainContent
ve LoginContent
.
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent"Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent"Runat="Server">
</asp:Content>
LoginContent
ContentPlaceHolder'ın varsayılan işaretlemesinin, kullanıcının kimliğinin doğrulanıp doğrulanmamış olmasına bağlı olarak sitede oturum açmak veya oturumu kapatmak için bir bağlantı görüntülediğini hatırlayın. Ancak, ASP.NET sayfasında İçerik denetiminin varlığı Content2
, ana sayfanın varsayılan işaretlemesini geçersiz kılar. Form Kimlik Doğrulamasına Genel Bakış öğreticisinde ele aldığımız gibi, varsayılan işaretlemenin geçersiz kılınması, sol sütunda oturum açmayla ilgili seçeneklerin görüntülenmesini istemediğimiz sayfalarda yararlıdır.
Ancak bu dört sayfa için ana sayfanın ContentPlaceHolder için varsayılan işaretlemesini LoginContent
göstermek istiyoruz. Bu nedenle, İçerik denetimi için bildirim temelli işaretlemeyi Content2
kaldırın. Bunu yaptıktan sonra, dört sayfanın işaretlemesinin her biri yalnızca bir İçerik denetimi içermelidir.
Son olarak, site haritasını (Web.sitemap
) bu yeni web sayfalarını içerecek şekilde güncelleştirelim. Üyelik öğreticileri için eklediğimizden sonra <siteMapNode>
aşağıdaki XML'yi ekleyin.
<siteMapNode title="Roles">
<siteMapNode url="~/Roles/ManageRoles.aspx" title="Manage Roles"/>
<siteMapNode url="~/Roles/UsersAndRoles.aspx" title="Users and Roles" />
<siteMapNode url="~/Roles/CreateUserWizardWithRoles.aspx" title="Create Account (with Roles)" />
<siteMapNode url="~/Roles/RoleBasedAuthorization.aspx" title="Role-Based Authorization" />
</siteMapNode>
Site haritası güncelleştirildiyse, siteyi bir tarayıcı üzerinden ziyaret edin. Şekil 2'de gösterildiği gibi, sol taraftaki gezinti artık Roller öğreticileri için öğeleri içerir.
Şekil 2: Klasöre Roles
Dört Yeni Sayfa Eklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)
2. Adım: Rol Çerçevesi Sağlayıcısını Belirtme ve Yapılandırma
Üyelik çerçevesi gibi Roller çerçevesi de sağlayıcı modelinin üzerinde oluşturulur. Güvenlik Temelleri ve ASP.NET Desteği öğreticisinde açıklandığı gibi, .NET Framework üç yerleşik Rol sağlayıcısıyla birlikte gönderilir: AuthorizationStoreRoleProvider
, WindowsTokenRoleProvider
ve SqlRoleProvider
. Bu öğretici serisi, rol deposu olarak bir Microsoft SQL Server veritabanı kullanan öğesine odaklanırSqlRoleProvider
.
Altında Roller çerçevesi yer alır ve SqlRoleProvider
üyelik çerçevesi ve SqlMembershipProvider
gibi çalışır. .NET Framework, Roller çerçevesine API olarak hizmet veren bir Roles
sınıf içerir. sınıfı Roles
, , DeleteRole
, GetAllRoles
, AddUserToRole
IsUserInRole
, vb. gibi CreateRole
statik yöntemlere sahiptir. Bu yöntemlerden biri çağrıldığında sınıf, Roles
çağrıyı yapılandırılan sağlayıcıya devreder. , SqlRoleProvider
yanıt olarak role özgü tablolarla (aspnet_Roles
ve aspnet_UsersInRoles
) çalışır.
Sağlayıcıyı SqlRoleProvider
uygulamamızda kullanmak için depo olarak hangi veritabanının kullanılacağını belirtmemiz gerekir. belirtilen SqlRoleProvider
rol deposunun belirli veritabanı tablolarına, görünümlerine ve saklı yordamlarına sahip olmasını bekler. Bu gerekli veritabanı nesneleri araç kullanılarak aspnet_regsql.exe
eklenebilir. Bu noktada, için SqlRoleProvider
gerekli şemaya sahip bir veritabanımız zaten vardır. SQL Server'de Üyelik Şeması Oluşturma öğreticisine geri dönerek adlı SecurityTutorials.mdf
bir veritabanı oluşturduk ve uygulamasının gerektirdiği veritabanı nesnelerini içeren uygulama hizmetlerini eklemek için kullandık aspnet_regsql.exe
SqlRoleProvider
. Bu nedenle Roller çerçevesine rol desteğini etkinleştirmesini ve veritabanıyla rol SecurityTutorials.mdf
deposu olarak kullanmasını SqlRoleProvider
söylememiz yeterlidir.
Roller çerçevesi, uygulamanın Web.config
dosyasındaki><roleManager
öğesi aracılığıyla yapılandırılır. Varsayılan olarak rol desteği devre dışıdır. Bunu etkinleştirmek için öğenin enabled
özniteliğini <roleManager
>true
şöyle ayarlamanız gerekir:
<?xml version="1.0"?>
<configuration>
<system.web>
... Additional configuration markup removed for brevity ...
<roleManager enabled="true" />
<system.web>
</configuration>
Varsayılan olarak, tüm web uygulamalarının türünde SqlRoleProvider
adlı AspNetSqlRoleProvider
bir Rol sağlayıcısı vardır. Bu varsayılan sağlayıcı konumunda machine.config
kayıtlıdır (konumunda %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG
bulunur):
<roleManager>
<providers>
<add name="AspNetSqlRoleProvider"
connectionStringName="LocalSqlServer"
applicationName="/"
type="System.Web.Security.SqlRoleProvider,
System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
Sağlayıcının connectionStringName
özniteliği, kullanılan rol depoyu belirtir. SağlayıcıAspNetSqlRoleProvider
, bu özniteliği LocalSqlServer
varsayılan olarak içinde ve işaretlerinde machine.config
de tanımlanan ve klasöründeki App_Data
aspnet.mdf
bir SQL Server 2005 Express Sürüm veritabanına ayarlar.
Sonuç olarak, uygulamamızın Web.config
dosyasında herhangi bir sağlayıcı bilgisi belirtmeden Roller çerçevesini etkinleştirirsek, uygulama varsayılan kayıtlı Roller sağlayıcısını AspNetSqlRoleProvider
kullanır. ~/App_Data/aspnet.mdf
Veritabanı yoksa, ASP.NET çalışma zamanı bunu otomatik olarak oluşturur ve uygulama hizmetleri şemasını ekler. Bununla birlikte, veritabanını kullanmak aspnet.mdf
istemiyoruz; bunun yerine, zaten oluşturduğumuz ve uygulama hizmetleri şemasını eklediğimiz veritabanını kullanmak SecurityTutorials.mdf
istiyoruz. Bu değişiklik iki yoldan biriyle gerçekleştirilebilir:
- için
LocalSqlServer
bir değer belirtinbağlantı dizesi adıWeb.config
. içindekiWeb.config
bağlantı dizesi adı değerininLocalSqlServer
üzerine yazarak varsayılan kayıtlı Roller sağlayıcısını (AspNetSqlRoleProvider
) kullanabilir ve veritabanıylaSecurityTutorials.mdf
düzgün çalışmasını sağlayabiliriz. Bu teknik hakkında daha fazla bilgi için Scott Guthrie'ninASP.NET 2.0 Uygulama Hizmetlerini SQL Server 2000 veya SQL Server 2005 Kullanacak Şekilde Yapılandırma blog gönderisine bakın. - Türünde yeni bir kayıtlı sağlayıcı
SqlRoleProvider
eklemeconnectionStringName
veayarınınSecurityTutorials.mdf
Veritabanı. Bu, SQL Server'da Üyelik Şeması Oluşturma öğreticisinde önerdiğim ve kullandığım yaklaşımdır ve bu öğreticide de kullanacağım yaklaşımdır.
Dosyaya aşağıdaki Roller yapılandırma işaretlemesini Web.config
ekleyin. Bu işaretleme adlı SecurityTutorialsSqlRoleProvider
yeni bir sağlayıcı kaydeder.
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="SecurityTutorialsConnectionString"
connectionString="..."/>
</connectionStrings>
<system.web>
... Additional configuration markup removed for brevity ...
<roleManager enabled="true" defaultProvider="SecurityTutorialsSqlRoleProvider">
<providers>
<add name="SecurityTutorialsSqlRoleProvider"
type="System.Web.Security.SqlRoleProvider"
applicationName="SecurityTutorials"
connectionStringName="SecurityTutorialsConnectionString" />
</providers>
</roleManager>
<system.web>
</configuration>
Yukarıdaki işaretleme varsayılan sağlayıcı olarak öğesini tanımlar SecurityTutorialsSqlRoleProvider
(öğesindeki defaultProvider
<roleManager>
özniteliği aracılığıyla). Ayrıca , 'nin ayarını olarak ayarlarSecurityTutorialsSqlRoleProvider
; bu, Üyelik sağlayıcısı (SecurityTutorialsSqlMembershipProvider
) tarafından kullanılan ayardırapplicationName
.SecurityTutorials
applicationName
Burada gösterilmese de öğesinin <add>
öğesi , veritabanı zaman aşımı süresini saniye cinsinden belirtmek için SqlRoleProvider
bir commandTimeout
öznitelik de içerebilir. Varsayılan değer 30’dur.
Bu yapılandırma işaretlemesi kullanıldığında, uygulamamızda rol işlevselliğini kullanmaya başlamaya hazırız.
Not
Yukarıdaki yapılandırma işaretlemesi, öğenin enabled
ve defaultProvider
özniteliklerinin kullanılmasını <roleManager
> gösterir. Roller çerçevesinin rol bilgilerini kullanıcı bazında nasıl ilişkilendirdiğini etkileyen başka öznitelikler de vardır. Bu ayarları Rol Tabanlı Yetkilendirme öğreticisinde inceleyeceğiz.
3. Adım: Roller API'sini inceleme
Roller çerçevesinin işlevselliği, rol tabanlı işlemleri gerçekleştirmek için on üç statik yöntem içeren sınıfı aracılığıyla Roles
kullanıma sunulur. 4. ve 6. Adımlarda rol oluşturma ve silme işlemlerine baktığımızda, sistemden CreateRole
rol ekleyen veya kaldıran ve DeleteRole
yöntemlerini kullanacağız.
Sistemdeki tüm rollerin listesini almak için yöntemini kullanın GetAllRoles
(bkz. 5. Adım). yöntemi, RoleExists
belirtilen rolün var olup olmadığını belirten bir Boole değeri döndürür.
Sonraki öğreticide kullanıcıları rollerle ilişkilendirmeyi inceleyeceğiz. Sınıfın Roles
AddUserToRole
, AddUserToRoles
, AddUsersToRole
ve AddUsersToRoles
yöntemleri bir veya daha fazla rol için bir veya daha fazla kullanıcı ekler. Kullanıcıları rollerden kaldırmak için , RemoveUserFromRoles
, RemoveUsersFromRole
veya RemoveUsersFromRoles
yöntemlerini kullanınRemoveUserFromRole
.
Rol Tabanlı Yetkilendirme öğreticisinde, şu anda oturum açmış olan kullanıcının rolüne göre işlevselliği program aracılığıyla göstermenin veya gizlemenin yollarını inceleyeceğiz. Bunu başarmak için sınıfının FindUsersInRole
, GetRolesForUser
, GetUsersInRole
veya IsUserInRole
yöntemlerini kullanabilirizRole
.
Not
Bu yöntemlerden herhangi biri çağrıldığında sınıfın çağrıyı Roles
yapılandırılan sağlayıcıya devreddiğini unutmayın. Bizim örneğimizde bu çağrının öğesine SqlRoleProvider
gönderildiği anlamına gelir. ardından SqlRoleProvider
, çağrılan yöntemine göre uygun veritabanı işlemini gerçekleştirir. Örneğin, kodRoles.CreateRole("Administrators")
, Administrators adlı tabloya aspnet_Roles_CreateRole
yeni bir kayıt ekleyen saklı yordamın yürütülmesiyle aspnet_Roles
sonuçlanıyorSqlRoleProvider
.
Bu öğreticinin geri kalanında, sistemdeki Roles
rolleri yönetmek için sınıfının CreateRole
, GetAllRoles
ve DeleteRole
yöntemlerinin kullanımına bakabilirsiniz.
4. Adım: Yeni Roller Oluşturma
Roller, kullanıcıları rastgele gruplandırmak için bir yol sunar ve en yaygın olarak bu gruplandırma, yetkilendirme kurallarını uygulamak için daha kolay bir yol için kullanılır. Ancak rolleri yetkilendirme mekanizması olarak kullanmak için önce uygulamada hangi rollerin mevcut olduğunu tanımlamamız gerekir. Ne yazık ki, ASP.NET CreateRoleWizard denetimi içermez. Yeni roller eklemek için uygun bir kullanıcı arabirimi oluşturmamız ve Roller API'sini kendimiz çağırmamız gerekir. İyi haber, bunu başarmak çok kolay.
Not
CreateRoleWizard Web denetimi olmasa da, web uygulamanızın yapılandırmasını görüntülemeye ve yönetmeye yardımcı olmak için tasarlanmış yerel bir ASP.NET uygulaması olan ASP.NET Web Sitesi Yönetim Aracı vardır. Ancak, iki nedenden dolayı ASP.NET Web Sitesi Yönetim Aracı'nın büyük bir hayranı değilim. İlk olarak, biraz karmaşıktır ve kullanıcı deneyimi istenen çok şey bırakır. İkinci olarak, ASP.NET Web Sitesi Yönetim Aracı yalnızca yerel olarak çalışacak şekilde tasarlanmıştır; başka bir deyişle, canlı bir sitede rolleri uzaktan yönetmeniz gerekiyorsa kendi rol yönetimi web sayfalarınızı oluşturmanız gerekir. Bu iki nedenle, bu öğretici ve sonraki öğretici, ASP.NET Web Sitesi Yönetim Aracı'nı kullanmak yerine bir web sayfasında gerekli rol yönetimi araçlarını oluşturmaya odaklanacaktır.
Klasördeki Roles
sayfayı ManageRoles.aspx
açın ve sayfaya bir TextBox ve Button Web denetimi ekleyin. TextBox denetiminin ID
özelliğini RoleName
sırasıyla olarak ve Button'ın ID
ve Text
özelliklerini CreateRoleButton
olarak ve Rol Oluştur olarak ayarlayın. Bu noktada, sayfanızın bildirim temelli işaretlemesi aşağıdakine benzer görünmelidir:
<b>Create a New Role: </b>
<asp:TextBox ID="RoleName" runat="server"></asp:TextBox>
<br />
<asp:Button ID="CreateRoleButton" runat="server" Text="Create Role" />
Ardından, olay işleyicisi CreateRoleButton
oluşturmak Click
için Tasarım Aracı Düğme denetimine çift tıklayın ve aşağıdaki kodu ekleyin:
protected void CreateRoleButton_Click(object sender, EventArgs e)
{
string newRoleName = RoleName.Text.Trim();
if (!Roles.RoleExists(newRoleName))
// Create the role
Roles.CreateRole(newRoleName);
RoleName.Text = string.Empty;
}
Yukarıdaki kod, TextBox'a RoleName
girilen kırpılmış rol adını değişkenine newRoleName
atayarak başlar. Ardından, rolün Roles
newRoleName
sistemde zaten mevcut olup olmadığını belirlemek için sınıfının RoleExists
yöntemi çağrılır. Rol yoksa, yöntemine CreateRole
bir çağrı yoluyla oluşturulur. Yönteme CreateRole
sistemde zaten var olan bir rol adı geçirilirse, bir ProviderException
özel durum oluşturulur. Bu nedenle kod, çağrısından CreateRole
önce rolün sistemde zaten mevcut olmadığından emin olmak için denetler. Olay işleyicisiClick
, TextBox Text
özelliğini temizleyerek RoleName
sona erer.
Not
Kullanıcı TextBox'a herhangi bir değer RoleName
girmezse ne olacağını merak ediyor olabilirsiniz. yöntemine CreateRole
null
geçirilen değer veya boş bir dizeyse, bir özel durum oluşturulur. Benzer şekilde, rol adı virgül içeriyorsa bir özel durum oluşturulur. Sonuç olarak, kullanıcının bir rol girdiğinden ve herhangi bir virgül içermediğinden emin olmak için sayfa doğrulama denetimleri içermelidir. Okuyucuya egzersiz yapmak için ayrılıyorum.
Şimdi Yöneticiler adlı bir rol oluşturalım. Tarayıcı üzerinden sayfayı ManageRoles.aspx
ziyaret edin, metin kutusuna Yöneticiler yazın (bkz. Şekil 3) ve ardından Rol Oluştur düğmesine tıklayın.
Şekil 3: Yönetici Rolü Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ne olur? Geri gönderme gerçekleşir, ancak rolün sisteme gerçekten eklendiğine dair görsel bir ipucu yoktur. 5. Adımda bu sayfayı görsel geri bildirim içerecek şekilde güncelleştireceğiz. Ancak şimdilik, veritabanına gidip SecurityTutorials.mdf
tablodaki verileri görüntüleyerek rolün oluşturulduğunu aspnet_Roles
doğrulayabilirsiniz. Şekil 4'de gösterildiği gibi, aspnet_Roles
tabloda yeni eklenen Yöneticiler rolleri için bir kayıt yer alır.
Şekil 4: Tabloda aspnet_Roles
Yöneticiler için Bir Satır Vardır (Tam boyutlu görüntüyü görüntülemek için tıklayın)
5. Adım: Sistemdeki Rolleri Görüntüleme
Şimdi sayfayı, sistemdeki ManageRoles.aspx
geçerli rollerin listesini içerecek şekilde genişletelim. Bunu yapmak için sayfaya bir GridView denetimi ekleyin ve özelliğini olarak RoleList
ayarlayınID
. Ardından, aşağıdaki kodu kullanarak sayfanın arka planda kod sınıfına adlı DisplayRolesInGrid
bir yöntem ekleyin:
private void DisplayRolesInGrid()
{
RoleList.DataSource = Roles.GetAllRoles();
RoleList.DataBind();
}
sınıfının Roles
GetAllRoles
yöntemi sistemdeki tüm rolleri dize dizisi olarak döndürür. Bu dize dizisi daha sonra GridView'a bağlıdır. Sayfa ilk yüklendiğinde rol listesini GridView'a bağlamak için, sayfanın Page_Load
olay işleyicisinden yöntemini çağırmamız DisplayRolesInGrid
gerekir. Aşağıdaki kod, sayfa ilk kez ziyaret edildiğinde bu yöntemi çağırır, ancak sonraki geri göndermelerde çağırılmaz.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
DisplayRolesInGrid();
}
Bu kod uygulandığında, tarayıcı üzerinden sayfayı ziyaret edin. Şekil 5'in gösterdiği gibi, Öğe etiketli tek sütunlu bir kılavuz görmeniz gerekir. Kılavuz, 4. Adımda eklediğimiz Yöneticiler rolü için bir satır içerir.
Şekil 5: GridView Rolleri Tek Sütunda Görüntüler (Tam boyutlu görüntüyü görüntülemek için tıklayın)
GridView'un özelliği True (varsayılan) olarak ayarlandığından GridView Öğesi etiketli tek bir sütun görüntüler ve bu da GridView'un AutoGenerateColumns
içindeki her özellik için otomatik olarak bir sütun oluşturmasına DataSource
neden olur. Bir dizi, dizideki öğeleri temsil eden tek bir özelliğe sahiptir, bu nedenle GridView'daki tek sütun.
GridView ile veri görüntülerken, sütunlarımı GridView tarafından örtük olarak oluşturmak yerine açıkça tanımlamayı tercih ediyorum. Sütunları açıkça tanımlayarak verileri biçimlendirmek, sütunları yeniden düzenlemek ve diğer yaygın görevleri gerçekleştirmek çok daha kolaydır. Bu nedenle GridView'un bildirim temelli işaretlemesini güncelleştirerek sütunlarının açıkça tanımlanmasını sağlayın.
GridView AutoGenerateColumns
özelliğini False olarak ayarlayarak başlayın. Ardından kılavuza bir TemplateField ekleyin, özelliğini Roller olarak ayarlayın HeaderText
ve dizinin içeriğini görüntüleyecek şekilde yapılandırın ItemTemplate
. Bunu yapmak için öğesine adlı RoleNameLabel
ItemTemplate
bir Etiket Web denetimi ekleyin ve özelliğini öğesine Container.DataItem
bağlayınText
.
Bu özellikler ve ItemTemplate
içerikleri bildirim temelli olarak veya GridView'un Alanlar iletişim kutusu ve Şablonları Düzenle arabirimi aracılığıyla ayarlanabilir. Alanlar iletişim kutusuna ulaşmak için GridView'un Akıllı Etiketindeki Sütunları Düzenle bağlantısına tıklayın. Ardından, Özelliği False olarak ayarlamak AutoGenerateColumns
için Alanları otomatik oluştur onay kutusunun işaretini kaldırın ve GridView'a bir TemplateField ekleyerek özelliğini Role olarak ayarlayın HeaderText
. İçeriklerini ItemTemplate
tanımlamak için GridView'un Akıllı Etiketi'nden Şablonları Düzenle seçeneğini belirleyin. Etiket Web denetimini üzerine ItemTemplate
sürükleyin, özelliğini olarak RoleNameLabel
ayarlayın ID
ve veri bağlama ayarlarını, özelliğinin Text
öğesine bağlanacak Container.DataItem
şekilde yapılandırın.
Hangi yaklaşımı kullanırsanız kullanın, işiniz bittiğinde GridView'un sonuçta elde edilen bildirim temelli işaretlemesi aşağıdakine benzer olmalıdır.
<asp:GridView ID="RoleList" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="Role">
<ItemTemplate>
<asp:Label runat="server" ID="RoleNameLabel" Text='<%# Container.DataItem %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Not
Dizinin içeriği, veri bağlama söz dizimi <%# Container.DataItem %>
kullanılarak görüntülenir. GridView'a bağlı bir dizinin içeriği görüntülenirken bu söz diziminin neden kullanıldığına ilişkin ayrıntılı bir açıklama bu öğreticinin kapsamı dışındadır. Bu konu hakkında daha fazla bilgi için bkz. Skaler Diziyi Veri Web Denetimine Bağlama.
Şu anda GridView RoleList
yalnızca sayfa ilk ziyaret edildiğinde rol listesine bağlıdır. Yeni bir rol eklendiğinde kılavuzu yenilememiz gerekir. Bunu gerçekleştirmek için Button'ın Click
olay işleyicisini yeni bir rol oluşturulduğunda yöntemini çağıracak DisplayRolesInGrid
şekilde güncelleştirinCreateRoleButton
.
protected void CreateRoleButton_Click(object sender, EventArgs e)
{
string newRoleName = RoleName.Text.Trim();
if (!Roles.RoleExists(newRoleName))
{
// Create the role
Roles.CreateRole(newRoleName);
// Refresh the RoleList Grid
DisplayRolesInGrid();
}
RoleName.Text = string.Empty;
}
Artık kullanıcı yeni bir rol RoleList
eklediğinde GridView geri göndermede yeni eklenen rolü gösterir ve rolün başarıyla oluşturulduğuna ilişkin görsel geri bildirim sağlar. Bunu göstermek için bir tarayıcı üzerinden sayfayı ManageRoles.aspx
ziyaret edin ve Supervisors adlı bir rol ekleyin. Rol Oluştur düğmesine tıkladıktan sonra bir geri gönderme başlatılır ve kılavuz Yöneticiler'in yanı sıra yeni Yöneticiler rolünü de içerecek şekilde güncelleştirilir.
Şekil 6: Gözetmen Rolü Eklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)
6. Adım: Rolleri Silme
Bu noktada kullanıcı yeni bir rol oluşturabilir ve mevcut tüm rolleri sayfadan ManageRoles.aspx
görüntüleyebilir. Kullanıcıların rolleri de silmesine izin verelim. yönteminin Roles.DeleteRole
iki aşırı yüklemesi vardır:
DeleteRole(roleName)
- roleName rolünü siler. Rol bir veya daha fazla üye içeriyorsa bir özel durum oluşturulur.DeleteRole(roleName, throwOnPopulatedRole)
- roleName rolünü siler. throwOnPopulateRole isetrue
, rol bir veya daha fazla üye içeriyorsa bir özel durum oluşturulur. throwOnPopulateRole isefalse
, rol herhangi bir üye içerse de içermese de silinir. yöntemi dahiliDeleteRole(roleName)
olarak öğesini çağırırDeleteRole(roleName, true)
.
DeleteRole
roleName ise veya boş bir dizeyse veya roleNamenull
virgül içeriyorsa yöntemi de bir özel durum oluşturur. roleName sistemde yoksa, DeleteRole
özel durum oluşturmadan sessizce başarısız olur.
Şimdi GridView'u ManageRoles.aspx
, tıklandığında seçili rolü silen bir Sil düğmesi içerecek şekilde genişletelim. Alanlar iletişim kutusuna gidip CommandField seçeneğinin altında bulunan Sil düğmesini ekleyerek GridView'a Sil düğmesi ekleyerek başlayın. Sil düğmesini en soldaki sütun yapın ve özelliğini Rolü Sil olarak ayarlayın DeleteText
.
Şekil 7: GridView'a RoleList
Sil Düğmesi Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sil düğmesini ekledikten sonra GridView'unuzun bildirim temelli işaretlemesi aşağıdakine benzer olmalıdır:
<asp:GridView ID="RoleList" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:CommandField DeleteText="Delete Role" ShowDeleteButton="True"/>
<asp:TemplateField HeaderText="Role">
<ItemTemplate>
<asp:Label runat="server" ID="RoleNameLabel" Text='<%# Container.DataItem %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Ardından GridView'un RowDeleting
olayı için bir olay işleyicisi oluşturun. Bu, Rolü Sil düğmesine tıklandığında geri gönderme sırasında tetiklenen olaydır. Olay işleyicisine aşağıdaki kodu ekleyin.
protected void RoleList_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
// Get the RoleNameLabel
Label RoleNameLabel = RoleList.Rows[e.RowIndex].FindControl("RoleNameLabel") as Label;
// Delete the role
Roles.DeleteRole(RoleNameLabel.Text, false);
// Rebind the data to the RoleList grid
DisplayRolesInGrid();
}
Kod, Rol Sil düğmesine tıklanan satırdaki Web denetimine program aracılığıyla başvurarak RoleNameLabel
başlar. Daha Roles.DeleteRole
sonra yöntemi çağrılır ve değerini geçirerek Text
RoleNameLabel
false
rolle ilişkilendirilmiş kullanıcı olup olmadığına bakılmaksızın rolü siler. Son olarak, RoleList
GridView yenilenir, böylece yenilenen rol artık kılavuzda görünmez.
Not
Rolü Sil düğmesi, rolü silmeden önce kullanıcıdan herhangi bir onay gerektirmez. Bir eylemi onaylamanın en kolay yollarından biri, istemci tarafı onaylama iletişim kutusudur. Bu teknik hakkında daha fazla bilgi için bkz . Silme sırasında onay Client-Side ekleme.
Özet
Birçok web uygulamasının yalnızca belirli kullanıcı sınıfları tarafından kullanılabilen belirli yetkilendirme kuralları veya sayfa düzeyi işlevleri vardır. Örneğin, yalnızca yöneticilerin erişebileceği bir dizi web sayfası olabilir. Bu yetkilendirme kurallarını kullanıcı bazında tanımlamak yerine, genellikle bir role göre kuralları tanımlamak daha yararlıdır. Diğer bir deyişle, Scott ve Jisun kullanıcılarının yönetim web sayfalarına erişmesine açıkça izin vermek yerine, Yöneticiler rolünün üyelerinin bu sayfalara erişmesine izin vermek ve ardından Scott ve Jisun'u Yöneticiler rolüne üye kullanıcılar olarak belirtmek daha sürdürülebilir bir yaklaşımdır.
Roller çerçevesi, rolleri oluşturmayı ve yönetmeyi kolaylaştırır. Bu öğreticide Rol çerçevesinin rol deposu olarak Microsoft SQL Server veritabanı kullanan öğesini kullanacak SqlRoleProvider
şekilde nasıl yapılandırıldığı incelendi. Ayrıca sistemdeki mevcut rolleri listeleyen ve yeni rollerin oluşturulmasını ve mevcut rollerin silinmesini sağlayan bir web sayfası oluşturduk. Sonraki öğreticilerde kullanıcıları rollere atamayı ve rol tabanlı yetkilendirme uygulamayı göreceğiz.
Mutlu Programlama!
Daha Fazla Bilgi
Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:
- ASP.NET 2.0'ın Üyeliğini, Rollerini ve Profilini inceleme
- Nasıl yapılır: ASP.NET 2.0'da Rol Yöneticisi Kullanma
- Rol Sağlayıcıları
- Öğe için
<roleManager>
teknik belgeler - Üyelik ve Rol Yöneticisi API'lerini kullanma
Yazar hakkında
Birden çok ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Scott'a adresinden mitchell@4guysfromrolla.com veya adresinden blogundan http://ScottOnWriting.NETulaşabilirsiniz.
Özel Teşekkürler
Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçirenleri arasında Alicja Maziarz, Suchi Banerjee ve Teresa Murphy yer alır. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana bir satır bırakın mitchell@4GuysFromRolla.com
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin