Aracılığıyla paylaş


Rolleri Oluşturma ve Yönetme (VB)

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ı Rolesyeni 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.

Roller Klasörüne Dört Yeni Sayfa Eklendi

Ş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.

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, WindowsTokenRoleProviderve 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 SqlRoleProviderSqlMembershipProvidergibi çalışır. .NET Framework, Roller çerçevesine API olarak hizmet veren bir Roles sınıf içerir. sınıfında Roles , , DeleteRole, GetAllRolesAddUserToRole, , IsUserInRolevb. gibi CreateRolepaylaşı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.exeeklenebilir. 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 SqlRoleProviderkullandı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 SqlRoleProvideradlı 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\CONFIGbulunur):

<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 LocalSqlServerolarak ayarlar ve varsayılan olarak içinde machine.config de tanımlanmıştır ve adlı aspnet.mdfklasö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ı AspNetSqlRoleProviderkullanı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:

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 ...

 &nbsp &nbsp<roleManager enabled="true" defaultProvider="SecurityTutorialsSqlRoleProvider">
 &nbsp &nbsp &nbsp<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.SecurityTutorialsapplicationName 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 Roleskullanı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 RolesAddUserToRole, AddUserToRoles, , AddUsersToRoleve 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, RemoveUsersFromRoleveya 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, GetUsersInRoleveya 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 SqlRoleProvidergö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_CreateRoleaspnet_Roles sonuçlanıyorSqlRoleProvider.

Bu öğreticinin geri kalanında, sistemdeki Roles rolleri yönetmek için sınıfının CreateRole, GetAllRolesve 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 RolesnewRoleName 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ı CreateRoleyapmadan ö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 CreateRoleNothing 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.

Yönetici Rolü Oluşturma

Ş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.

aspnet_Roles Tablosunda Yöneticiler için Bir Satır Var

Ş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 RoleListayarlayı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 RolesGetAllRoles 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.

GridView Rolleri Tek Bir Sütunda Görüntüler

Ş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 DataSourceneden 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ı RoleNameLabelItemTemplate bir Etiket Web denetimi ekleyin ve özelliğini öğesine bağlayın TextContainer.DataItem.

Bu özellikler ve ItemTemplateiç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 ItemTemplatetanımlamak için GridView'un Akıllı Etiketi'nden Şablonları Düzenle seçeneğini belirleyin. Etiket Web denetimini üzerine ItemTemplatesürükleyin, özelliğini olarak RoleNameLabelayarlayın ID ve veri bağlama ayarlarını, özelliğinin Text bağlı olması için Container.DataItemyapı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.

Gözetmen Rolü Eklendi

Ş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 dahili DeleteRole(roleName) olarak öğesini çağırır DeleteRole(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 .

RoleList GridView'a Sil Düğmesi Ekleme

Ş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 TextRoleNameLabelFalserolle 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:

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