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

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>

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.

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, 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 SqlRoleProvider üyelik çerçevesi ve SqlMembershipProvidergibi çalışır. .NET Framework, Roller çerçevesine API olarak hizmet veren bir Roles sınıf içerir. sınıfı Roles , , DeleteRole, GetAllRoles, AddUserToRoleIsUserInRole, vb. gibi CreateRolestatik 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.exeeklenebilir. Bu noktada, için SqlRoleProvidergerekli ş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.exeSqlRoleProvider. 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 LocalSqlServervarsayılan olarak içinde ve işaretlerinde machine.config de tanımlanan ve klasöründeki App_Dataaspnet.mdfbir 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ı AspNetSqlRoleProviderkullanı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:

Dosyaya aşağıdaki Roller yapılandırma işaretlemesini Web.config ekleyin. Bu işaretleme adlı SecurityTutorialsSqlRoleProvideryeni 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.SecurityTutorialsapplicationName 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 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, ş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, GetUsersInRoleveya 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 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, 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, GetAllRolesve 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 RolesnewRoleName 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 CreateRolenull 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.

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 gösterildiği gibi, aspnet_Roles tabloda yeni eklenen Yöneticiler rolleri için bir kayıt yer alır.

aspnet_Roles Tablosunda Yöneticiler için Bir Satır Vardı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 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 void DisplayRolesInGrid()
{
    RoleList.DataSource = Roles.GetAllRoles();
    RoleList.DataBind();
}

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

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, 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ı RoleNameLabelItemTemplate bir Etiket Web denetimi ekleyin ve özelliğini öğesine Container.DataItembağlayınText.

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

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

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