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.
tarafından Scott Mitchell
Not
Bu makale yazıldığından beri, ASP.NET Üyeliği 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 çeşitli avantajlara sahiptir, örneğin:
- 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
Kod İndirme veya PDF İndirme
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 ASP.NET sayfasının işlevselliğini ziyaret eden kullanıcıya göre ayarlamaya yönelik bildirim temelli ve programlı teknikleri inceledik. Ancak, sayfa erişimi veya işlevselliği için 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 yetkilendirmeyi her 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önetici 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ı iade edip 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 rol oluşturup silebilir, bir role kullanıcı ekleyebilir veya rolden kullanıcı kaldırabilir, belirli bir role ait olan kullanıcı kümesini belirleyebilir ve kullanıcının belirli bir role ait olup olmadığını anlayabiliriz. 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 o anda oturum açmış olan kullanıcının rollerine bağlı olarak ek bilgileri veya işlevleri bir sayfada 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ıları nasıl ekleyip rollerden kaldıracağımıza bakacağız. 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 öğreticide 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 Roles
dört yeni ASP.NET sayfası 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>
ContentPlaceHolder'ın varsayılan işaretlemesinin LoginContent
, kullanıcının kimliğinin doğrulanıp doğrulanmadığı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şaretlemeyi geçersiz kılma işlemi, oturum açmayla ilgili seçeneklerin sol sütunda 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, tarayıcı üzerinden siteyi 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 resmi görüntülemek için tıklayın)
2. Adım: Roles Framework 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 üyelik çerçevesi ve SqlRoleProvider
SqlMembershipProvider
gibi çalışır. .NET Framework, Roller çerçevesine API olarak hizmet veren bir Roles
sınıf içerir. sınıfında Roles
, , DeleteRole
, GetAllRoles
AddUserToRole
, , IsUserInRole
vb. gibi CreateRole
paylaşılan yöntemler vardır. 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 kullanılacak veritabanı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 gerekli SqlRoleProvider
ş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 SqlRoleProvider
kullandıkaspnet_regsql.exe
. 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
olarak ayarlar ve varsayılan olarak içinde machine.config
de tanımlanmıştır ve adlı aspnet.mdf
klasördeki App_Data
SQL Server 2005 Express Sürüm veritabanına işaret etmektedir.
Sonuç olarak, uygulamamızın Web.config
dosyasında hiç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. Ancak veritabanını kullanmak aspnet.mdf
istemiyoruz; bunun yerine zaten oluşturduğumuz ve uygulama hizmetleri şemasını SecurityTutorials.mdf
eklediğimiz veritabanını kullanmak istiyoruz. Bu değişiklik iki yoldan biriyle gerçekleştirilebilir:
- için
LocalSqlServer
bir değer belirtinbağlantıWeb.config
dizesi adı. 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
SqlRoleProvider
yeni bir kayıtlı sağlayıcı eklemeconnectionStringName
veayarınınSecurityTutorials.mdf
Veritabanı. Bu, SQL Server'de Ü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ı yeni bir sağlayıcı kaydeder SecurityTutorialsSqlRoleProvider.
<?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 ' ın ayarını olarak ayarlarSecurityTutorialsSqlRoleProvider
. Bu applicationName
ayar Üyelik sağlayıcısı () tarafından kullanılan ayardırSecurityTutorialsSqlMembershipProvider
.SecurityTutorials
applicationName
Burada gösterilmese de öğesi, <add>
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 gerçekleştiğinde, uygulamamızda rol işlevselliğini kullanmaya başlamaya hazırız.
Not
Yukarıdaki yapılandırma işaretlemesi, öğesinin <roleManager>
enabled
ve defaultProvider
özniteliklerinin kullanılmasını gösterir. Roller çerçevesinin rol bilgilerini kullanıcı bazında nasıl ilişkilendirdiğini etkileyen bir dizi başka öznitelik 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 üç paylaşılan 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, o 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 Rol sınıfının FindUsersInRole
, GetRolesForUser
, GetUsersInRole
veya IsUserInRole
yöntemlerini kullanabiliriz.
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 kod, Roles.CreateRole("Administrators")
Administrators adlı tabloya yeni bir kayıt ekleyen saklı yordamın yürütülmesiyle aspnet_Roles_CreateRole
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öntemlerini kullanma konusuna 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 buggy ve kullanıcı deneyimi istenen çok şey bırakır. İkincisi, 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
ve düğmenin ID
ve Text
özelliklerini sırasıyla ve Rol Oluştur olarak CreateRoleButton
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 oluşturmak Click
için Tasarım Aracı Düğme denetimine çift tıklayın CreateRoleButton
ve aşağıdaki kodu ekleyin:
Protected Sub CreateRoleButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateRoleButton.Click
Dim newRoleName As String = RoleName.Text.Trim()
If Not Roles.RoleExists(newRoleName) Then
' Create the role
Roles.CreateRole(newRoleName)
End If
RoleName.Text= String.Empty
End Sub
Yukarıdaki kod, TextBox'a RoleName
girilen kırpılmış rol adını değişkene newRoleName
atayarak başlar. Ardından, rolün Roles
newRoleName
sistemde zaten var olup olmadığını belirlemek için sınıfı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ı CreateRole
yapmadan ö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
Nothing
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. Okuyucu için bir alıştırma olarak gidiyorum.
Ş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 aspnet_Roles
gösterildiği gibi, 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 Sub DisplayRolesInGrid()
RoleList.DataSource = Roles.GetAllRoles()
RoleList.DataBind()
End Sub
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 ziyaret edildiğinde bu yöntemi çağırır, ancak sonraki geri göndermelerde çağırılmaz.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
DisplayRolesInGrid()
End If
End Sub
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, gridview tarafından örtük olarak oluşturulması yerine sütunlarımı 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 özelliğini AutoGenerateColumns
False olarak ayarlayarak başlayın. Ardından kılavuza bir TemplateField ekleyin, özelliğini HeaderText
Roller olarak ayarlayın 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 bağlayın Text
Container.DataItem.
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
bağlı olması için Container.DataItem
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 konuda 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şturulursa yöntemini çağıracak DisplayRolesInGrid
şekilde güncelleştirinCreateRoleButton
.
Protected Sub CreateRoleButton_Click(ByVal sender As Object,ByVal e As System.EventArgs) Handles CreateRoleButton.Click
Dim newRoleName As String = RoleName.Text.Trim()
If Not Roles.RoleExists(newRoleName) Then
' Create the role
Roles.CreateRole(newRoleName)
' Refresh the RoleList Grid
DisplayRolesInGrid()
End If
RoleName.Text = String.Empty
End Sub
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 sayfayı ManageRoles.aspx
bir tarayıcı üzerinden 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 ve yeni rol Olan Gözetmenler'i 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 sayfadan var olan tüm rolleri 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 roleNameNothing
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 Sub RoleList_RowDeleting(ByVal sender As Object,ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles RoleList.RowDeleting
' Get the RoleNameLabel
Dim RoleNameLabel As Label = CType(RoleList.Rows(e.RowIndex).FindControl("RoleNameLabel"),Label)
' Delete the role
Roles.DeleteRole(RoleNameLabel.Text,False)
' Rebind the data to the RoleList grid
DisplayRolesInGrid()
End Sub
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