Bagikan melalui


Membuat dan Mengelola Peran (C#)

oleh Scott Mitchell

Catatan

Sejak artikel ini ditulis, penyedia keanggotaan ASP.NET telah digantikan oleh ASP.NET Identity. Kami sangat menyarankan untuk memperbarui aplikasi untuk menggunakan platform identitas ASP.NET daripada penyedia Keanggotaan yang ditampilkan pada saat artikel ini ditulis. ASP.NET Identity memiliki sejumlah keunggulan dibandingkan sistem Keanggotaan ASP.NET, termasuk :

  • Performa yang lebih baik
  • Peningkatan ekstensibilitas dan uji coba
  • Dukungan untuk OAuth, OpenID Connect, dan autentikasi dua faktor
  • Dukungan Identitas berbasis klaim
  • Interoperabilitas yang lebih baik dengan ASP.Net Core

Unduh Kode atau Unduh PDF

Tutorial ini memeriksa langkah-langkah yang diperlukan untuk mengonfigurasi kerangka kerja Peran. Setelah itu, kami akan membuat halaman web untuk membuat dan menghapus peran.

Pengantar

Dalam tutorial Otorisasi Berbasis Pengguna, kami melihat menggunakan otorisasi URL untuk membatasi pengguna tertentu dari sekumpulan halaman dan menjelajahi teknik deklaratif dan terprogram untuk menyesuaikan fungsionalitas halaman ASP.NET berdasarkan pengguna yang mengunjungi. Namun, memberikan izin untuk akses halaman atau fungsionalitas berdasarkan pengguna demi pengguna dapat menjadi mimpi buruk pemeliharaan dalam skenario di mana ada banyak akun pengguna atau ketika hak istimewa pengguna sering berubah. Setiap kali pengguna mendapatkan atau kehilangan otorisasi untuk melakukan tugas tertentu, administrator perlu memperbarui aturan otorisasi URL yang sesuai, markup deklaratif, dan kode.

Ini biasanya membantu mengklasifikasikan pengguna ke dalam grup atau peran dan kemudian menerapkan izin berdasarkan peran demi peran. Misalnya, sebagian besar aplikasi web memiliki sekumpulan halaman atau tugas tertentu yang hanya dicadangkan untuk pengguna administratif. Dengan menggunakan teknik yang dipelajari dalam tutorial Otorisasi Berbasis Pengguna , kami akan menambahkan aturan otorisasi URL yang sesuai, markup deklaratif, dan kode untuk memungkinkan akun pengguna yang ditentukan melakukan tugas administratif. Tetapi jika administrator baru ditambahkan atau jika administrator yang ada perlu mencabut hak administrasinya, kita harus mengembalikan dan memperbarui file konfigurasi dan halaman web. Namun, dengan peran, kita dapat membuat peran yang disebut Administrator dan menetapkan pengguna tepercaya tersebut ke peran Administrator. Selanjutnya, kami akan menambahkan aturan otorisasi URL yang sesuai, markup deklaratif, dan kode untuk memungkinkan peran Administrator melakukan berbagai tugas administratif. Dengan adanya infrastruktur ini, menambahkan administrator baru ke situs atau menghapus yang sudah ada semampunya termasuk atau menghapus pengguna dari peran Administrator. Tidak diperlukan konfigurasi, markup deklaratif, atau perubahan kode.

ASP.NET menawarkan kerangka kerja Peran untuk menentukan peran dan mengaitkannya dengan akun pengguna. Dengan kerangka kerja Peran, kita dapat membuat dan menghapus peran, menambahkan pengguna ke atau menghapus pengguna dari peran, menentukan sekumpulan pengguna yang termasuk dalam peran tertentu, dan memberi tahu apakah pengguna termasuk dalam peran tertentu. Setelah kerangka kerja Peran dikonfigurasi, kami dapat membatasi akses ke halaman berdasarkan peran demi peran melalui aturan otorisasi URL dan menampilkan atau menyembunyikan informasi atau fungsionalitas tambahan di halaman berdasarkan peran pengguna yang saat ini masuk.

Tutorial ini memeriksa langkah-langkah yang diperlukan untuk mengonfigurasi kerangka kerja Peran. Setelah itu, kami akan membuat halaman web untuk membuat dan menghapus peran. Dalam tutorial Menetapkan Peran ke Pengguna, kita akan melihat cara menambahkan dan menghapus pengguna dari peran. Dan dalam tutorial Otorisasi Berbasis Peran kita akan melihat cara membatasi akses ke halaman berdasarkan peran demi peran bersama dengan cara menyesuaikan fungsionalitas halaman tergantung pada peran pengguna yang mengunjungi. Mari kita mulai!

Langkah 1: Menambahkan Halaman ASP.NET Baru

Dalam tutorial ini dan dua berikutnya kita akan memeriksa berbagai fungsi dan kemampuan terkait peran. Kita akan membutuhkan serangkaian halaman ASP.NET untuk mengimplementasikan topik yang diperiksa di seluruh tutorial ini. Mari kita buat halaman ini dan perbarui peta situs.

Mulailah dengan membuat folder baru dalam proyek bernama Roles. Selanjutnya, tambahkan empat halaman ASP.NET baru ke Roles folder, menautkan setiap halaman dengan Site.master halaman master. Beri nama halaman:

  • ManageRoles.aspx
  • UsersAndRoles.aspx
  • CreateUserWizardWithRoles.aspx
  • RoleBasedAuthorization.aspx

Pada titik ini, Penjelajah Solusi proyek Anda akan terlihat mirip dengan cuplikan layar yang ditunjukkan pada Gambar 1.

Empat Halaman Baru Telah Ditambahkan ke Folder Peran

Gambar 1: Empat Halaman Baru Telah Ditambahkan ke Roles Folder (Klik untuk melihat gambar ukuran penuh)

Setiap halaman harus, pada titik ini, memiliki dua kontrol Konten, satu untuk masing-masing ContentPlaceHolders halaman master: MainContent dan LoginContent.

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent"Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent"Runat="Server">
</asp:Content>

Ingat bahwa LoginContent markup default ContentPlaceHolder menampilkan tautan untuk masuk atau keluar dari situs, tergantung pada apakah pengguna diautentikasi. Kehadiran Content2 kontrol Konten di halaman ASP.NET, namun, menggantikan markup default halaman master. Seperti yang kita bahas dalam Gambaran Umum tutorial Autentikasi Formulir , mengambil alih markup default berguna di halaman di mana kita tidak ingin menampilkan opsi terkait login di kolom kiri.

Namun, untuk keempat halaman ini, kami ingin menampilkan markup default halaman master untuk LoginContent ContentPlaceHolder. Oleh karena itu, hapus markup deklaratif untuk Content2 kontrol Konten. Setelah melakukannya, masing-masing dari empat markup halaman hanya boleh berisi satu kontrol Konten.

Terakhir, mari kita perbarui peta situs (Web.sitemap) untuk menyertakan halaman web baru ini. Tambahkan XML berikut setelah <siteMapNode> kami menambahkan untuk tutorial Keanggotaan.

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

Dengan peta situs yang diperbarui, kunjungi situs melalui browser. Seperti yang ditunjukkan Gambar 2, navigasi di sebelah kiri sekarang menyertakan item untuk tutorial Peran.

Navigasi di sebelah kiri sekarang menyertakan item untuk tutorial Peran.

Gambar 2: Empat Halaman Baru Telah Ditambahkan ke Roles Folder (Klik untuk melihat gambar ukuran penuh)

Langkah 2: Menentukan dan Mengonfigurasi Penyedia Kerangka Kerja Peran

Seperti kerangka kerja Keanggotaan, kerangka kerja Peran dibangun di atas model penyedia. Seperti yang dibahas dalam tutorial Dasar-Dasar Keamanan dan Dukungan ASP.NET, .NET Framework dikirim dengan tiga penyedia Peran bawaan: AuthorizationStoreRoleProvider, , WindowsTokenRoleProviderdan SqlRoleProvider. Seri tutorial ini berfokus pada SqlRoleProvider, yang menggunakan database Microsoft SQL Server sebagai penyimpanan peran.

Di bawahnya mencakup kerangka kerja Peran dan SqlRoleProvider berfungsi seperti kerangka kerja Keanggotaan dan SqlMembershipProvider. .NET Framework berisi Roles kelas yang berfungsi sebagai API ke kerangka kerja Peran. Kelas Roles ini memiliki metode statis seperti CreateRole, , DeleteRole, GetAllRolesAddUserToRole, IsUserInRole, dan sebagainya. Ketika salah satu metode ini dipanggil, Roles kelas mendelegasikan panggilan ke penyedia yang dikonfigurasi. bekerja SqlRoleProvider dengan tabel khusus peran (aspnet_Roles dan aspnet_UsersInRoles) sebagai respons.

Untuk menggunakan SqlRoleProvider penyedia dalam aplikasi kami, kita perlu menentukan database apa yang akan digunakan sebagai penyimpanan. SqlRoleProvider mengharapkan penyimpanan peran yang ditentukan memiliki tabel database, tampilan, dan prosedur tersimpan tertentu. Objek database yang diperlukan ini dapat ditambahkan menggunakan alat iniaspnet_regsql.exe. Pada titik ini kita sudah memiliki database dengan skema yang diperlukan untuk SqlRoleProvider. Kembali ke tutorial Membuat Skema Keanggotaan dalam SQL Server kami membuat database bernama SecurityTutorials.mdf dan digunakan aspnet_regsql.exe untuk menambahkan layanan aplikasi, yang menyertakan objek database yang diperlukan oleh SqlRoleProvider. Oleh karena itu kita hanya perlu memberi tahu kerangka kerja Peran untuk mengaktifkan dukungan peran dan menggunakan SqlRoleProvider dengan SecurityTutorials.mdf database sebagai penyimpanan peran.

Kerangka kerja Peran dikonfigurasi melalui <roleManager> elemen dalam file aplikasi.Web.config Secara default, dukungan peran dinonaktifkan. Untuk mengaktifkannya, Anda harus mengatur <roleManager> atribut elemen enabled menjadi true seperti ini:

<?xml version="1.0"?>
<configuration>
 <system.web>
 ... Additional configuration markup removed for brevity ...

 <roleManager enabled="true" />
 <system.web>
</configuration>

Secara default, semua aplikasi web memiliki penyedia Peran bernama AspNetSqlRoleProvider jenis SqlRoleProvider. Penyedia default ini terdaftar di machine.config (terletak di %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG):

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

Atribut penyedia connectionStringName menentukan penyimpanan peran yang digunakan. Penyedia AspNetSqlRoleProvider mengatur atribut ini ke LocalSqlServer, yang juga didefinisikan dalam machine.config dan menunjuk, secara default, ke database SQL Server 2005 Express Edition di App_Data folder bernama aspnet.mdf.

Akibatnya, jika kita hanya mengaktifkan kerangka kerja Peran tanpa menentukan informasi penyedia apa pun dalam file aplikasi Web.config kita, aplikasi menggunakan penyedia Peran terdaftar default, AspNetSqlRoleProvider. ~/App_Data/aspnet.mdf Jika database tidak ada, runtime ASP.NET akan secara otomatis membuatnya dan menambahkan skema layanan aplikasi. Namun, kami tidak ingin menggunakan aspnet.mdf database; melainkan, kami ingin menggunakan SecurityTutorials.mdf database yang telah kami buat dan menambahkan skema layanan aplikasi. Modifikasi ini dapat dicapai dengan salah satu dari dua cara:

  • Tentukan nilai untukLocalSqlServernama string koneksi diWeb.config. Dengan menimpa LocalSqlServer nilai nama string koneksi di Web.config, kita dapat menggunakan penyedia Peran terdaftar default (AspNetSqlRoleProvider) dan membuatnya berfungsi dengan benar dengan SecurityTutorials.mdf database. Untuk informasi selengkapnya tentang teknik ini, lihat posting blog Scott Guthrie, Mengonfigurasi Layanan Aplikasi ASP.NET 2.0 untuk Menggunakan SQL Server 2000 atau SQL Server 2005.
  • Menambahkan penyedia terdaftar baru jenisSqlRoleProviderdan mengonfigurasiconnectionStringNamepengaturan untuk menunjuk keSecurityTutorials.mdfDatabase. Ini adalah pendekatan yang saya rekomendasikan dan gunakan dalam membuat Skema Keanggotaan dalam tutorial SQL Server, dan itu adalah pendekatan yang akan saya gunakan dalam tutorial ini juga.

Tambahkan markup konfigurasi Peran berikut ke Web.config file . Markup ini mendaftarkan penyedia baru bernama 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>

Markup di atas mendefinisikan SecurityTutorialsSqlRoleProvider sebagai penyedia default (melalui defaultProvider atribut dalam <roleManager> elemen ). Ini juga mengatur pengaturan ke , yang merupakan pengaturan yang sama yang applicationName digunakan oleh penyedia Keanggotaan (SecurityTutorialsSqlMembershipProvider).applicationNameSecurityTutorialsSecurityTutorialsSqlRoleProvider Meskipun tidak ditampilkan di sini, <add> elemen untuk SqlRoleProvider mungkin juga berisi commandTimeout atribut untuk menentukan durasi batas waktu database, dalam hitungan detik. Nilai default adalah 30.

Dengan markup konfigurasi ini, kami siap untuk mulai menggunakan fungsionalitas peran dalam aplikasi kami.

Catatan

Markup konfigurasi di atas mengilustrasikan menggunakan <roleManager> atribut dan defaultProvider elemen enabled . Ada sejumlah atribut lain yang memengaruhi bagaimana kerangka kerja Peran mengaitkan informasi peran berdasarkan pengguna demi pengguna. Kami akan memeriksa pengaturan ini dalam tutorial Otorisasi Berbasis Peran.

Langkah 3: Memeriksa API Peran

Fungsionalitas kerangka kerja Peran diekspos melalui Roles kelas , yang berisi tiga belas metode statis untuk melakukan operasi berbasis peran. Ketika kita melihat membuat dan menghapus peran di Langkah 4 dan 6 kita akan menggunakan CreateRole metode dan DeleteRole , yang menambahkan atau menghapus peran dari sistem.

Untuk mendapatkan daftar semua peran dalam sistem, gunakan GetAllRoles metode (lihat Langkah 5). Metode mengembalikan RoleExists nilai Boolean yang menunjukkan apakah peran tertentu ada.

Dalam tutorial berikutnya kita akan memeriksa cara mengaitkan pengguna dengan peran. Metode Roles kelas AddUserToRole, AddUserToRoles, AddUsersToRole, dan AddUsersToRoles menambahkan satu atau beberapa pengguna ke satu atau beberapa peran. Untuk menghapus pengguna dari peran, gunakan RemoveUserFromRolemetode , , RemoveUserFromRolesRemoveUsersFromRole, atau RemoveUsersFromRoles .

Dalam tutorial Otorisasi Berbasis Peran, kita akan melihat cara untuk menampilkan atau menyembunyikan fungsionalitas secara terprogram berdasarkan peran pengguna yang saat ini masuk. Untuk mencapai hal ini, kita dapat menggunakan metode kelas FindUsersInRole, , GetUsersInRoleGetRolesForUser, atau IsUserInRole .Role

Catatan

Perlu diingat bahwa setiap kali salah satu metode ini dipanggil, Roles kelas mendelegasikan panggilan ke penyedia yang dikonfigurasi. Dalam kasus kami, ini berarti bahwa panggilan sedang dikirim ke SqlRoleProvider. SqlRoleProvider kemudian melakukan operasi database yang sesuai berdasarkan metode yang dipanggil. Misalnya, kode Roles.CreateRole("Administrators") menghasilkan SqlRoleProvider menjalankan prosedur tersimpan aspnet_Roles_CreateRole , yang menyisipkan rekaman baru ke aspnet_Roles dalam tabel bernama Administrator .

Sisa tutorial ini melihat menggunakan Roles metode kelas CreateRole, GetAllRoles, dan DeleteRole untuk mengelola peran dalam sistem.

Langkah 4: Membuat Peran Baru

Peran menawarkan cara untuk mengelompokkan pengguna secara sewenang-wenang, dan paling umum pengelompokan ini digunakan untuk cara yang lebih nyaman untuk menerapkan aturan otorisasi. Tetapi untuk menggunakan peran sebagai mekanisme otorisasi, pertama-tama kita perlu menentukan peran apa yang ada dalam aplikasi. Sayangnya, ASP.NET tidak menyertakan kontrol CreateRoleWizard. Untuk menambahkan peran baru, kita perlu membuat antarmuka pengguna yang sesuai dan memanggil API Peran sendiri. Kabar baiknya adalah bahwa ini sangat mudah dicapai.

Catatan

Meskipun tidak ada kontrol Web CreateRoleWizard, ada Alat Administrasi Situs Web ASP.NET, yang merupakan aplikasi ASP.NET lokal yang dirancang untuk membantu melihat dan mengelola konfigurasi aplikasi web Anda. Namun, saya bukan penggemar berat Alat Administrasi Situs Web ASP.NET karena dua alasan. Pertama, itu adalah sedikit buggy dan pengalaman pengguna meninggalkan banyak hal yang diinginkan. Kedua, Alat Administrasi Situs Web ASP.NET dirancang untuk hanya berfungsi secara lokal, yang berarti Bahwa Anda harus membangun halaman web manajemen peran Anda sendiri jika Anda perlu mengelola peran di situs langsung dari jarak jauh. Untuk dua alasan ini, tutorial ini dan yang berikutnya akan fokus pada membangun alat manajemen peran yang diperlukan di halaman web daripada mengandalkan Alat Administrasi Situs Web ASP.NET.

ManageRoles.aspx Buka halaman di Roles folder dan tambahkan TextBox dan kontrol Web Tombol ke halaman. Atur properti kontrol ID TextBox ke RoleName dan tombol ID dan Text properti masing-masing ke CreateRoleButton dan Buat Peran. Pada titik ini, markup deklaratif halaman Anda akan terlihat mirip dengan yang berikut ini:

<b>Create a New Role: </b>
<asp:TextBox ID="RoleName" runat="server"></asp:TextBox>
<br />
<asp:Button ID="CreateRoleButton" runat="server" Text="Create Role" />

Selanjutnya, klik CreateRoleButton dua kali kontrol Tombol di Designer untuk membuat Click penanganan aktivitas lalu tambahkan kode berikut:

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

Kode di atas dimulai dengan menetapkan nama peran yang dipangkas yang dimasukkan di RoleName TextBox ke newRoleName variabel . Selanjutnya, Roles metode kelas RoleExists dipanggil untuk menentukan apakah peran newRoleName sudah ada dalam sistem. Jika peran tidak ada, peran dibuat melalui panggilan ke CreateRole metode . CreateRole Jika metode diteruskan nama peran yang sudah ada dalam sistem, ProviderException pengecualian akan dilemparkan. Inilah sebabnya mengapa kode pertama kali memeriksa untuk memastikan bahwa peran belum ada dalam sistem sebelum memanggil CreateRole. Penanganan Click aktivitas menyimpulkan dengan menghapus RoleName properti TextBox Text .

Catatan

Anda mungkin bertanya-tanya apa yang akan terjadi jika pengguna tidak memasukkan nilai apa pun ke RoleName dalam TextBox. Jika nilai yang diteruskan ke CreateRole metode adalah null atau string kosong, pengecualian akan dinaikkan. Demikian juga, jika nama peran berisi koma, pengecualian akan dimunculkan. Akibatnya, halaman harus berisi kontrol validasi untuk memastikan bahwa pengguna memasukkan peran dan tidak berisi koma apa pun. Saya pergi sebagai latihan untuk pembaca.

Mari kita buat peran bernama Administrator. ManageRoles.aspx Kunjungi halaman melalui browser, ketik Administrator ke dalam kotak teks (lihat Gambar 3), lalu klik tombol Buat Peran.

Membuat Peran Administrator

Gambar 3: Buat Peran Administrator (Klik untuk melihat gambar ukuran penuh)

Apa yang terjadi? Postback terjadi, tetapi tidak ada isensi visual bahwa peran tersebut sebenarnya telah ditambahkan ke sistem. Kami akan memperbarui halaman ini di Langkah 5 untuk menyertakan umpan balik visual. Namun, untuk saat ini, Anda dapat memverifikasi bahwa peran dibuat dengan masuk ke SecurityTutorials.mdf database dan menampilkan data dari aspnet_Roles tabel. Seperti yang ditunjukkan aspnet_Roles Gambar 4, tabel berisi rekaman untuk peran Administrator yang baru ditambahkan.

Tabel aspnet_Roles memiliki Baris untuk Administrator

Gambar 4: aspnet_Roles Tabel memiliki Baris untuk Administrator (Klik untuk melihat gambar ukuran penuh)

Langkah 5: Menampilkan Peran dalam Sistem

Mari kita tambahkan ManageRoles.aspx halaman untuk menyertakan daftar peran saat ini dalam sistem. Untuk mencapai hal ini, tambahkan kontrol GridView ke halaman dan atur propertinya ID ke RoleList. Selanjutnya, tambahkan metode ke kelas code-behind halaman bernama DisplayRolesInGrid menggunakan kode berikut:

private void DisplayRolesInGrid()
{
    RoleList.DataSource = Roles.GetAllRoles();
    RoleList.DataBind();
}

Metode Roles kelas GetAllRoles mengembalikan semua peran dalam sistem sebagai array string. Array string ini kemudian terikat ke GridView. Untuk mengikat daftar peran ke GridView ketika halaman pertama kali dimuat, kita perlu memanggil DisplayRolesInGrid metode dari penanganan aktivitas halaman Page_Load . Kode berikut memanggil metode ini ketika halaman pertama kali dikunjungi, tetapi tidak pada postback berikutnya.

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    DisplayRolesInGrid();
}

Dengan kode ini di tempat, kunjungi halaman melalui browser. Seperti yang diperlihatkan Gambar 5, Anda akan melihat kisi dengan satu kolom berlabel Item. Kisi menyertakan baris untuk peran Administrator yang kami tambahkan di Langkah 4.

GridView Menampilkan Peran dalam Satu Kolom

Gambar 5: GridView Menampilkan Peran dalam Kolom Tunggal (Klik untuk melihat gambar ukuran penuh)

GridView menampilkan kolom penyepian berlabel Item karena properti GridView AutoGenerateColumns diatur ke True (default), yang menyebabkan GridView secara otomatis membuat kolom untuk setiap properti di dalamnya DataSource. Array memiliki properti tunggal yang mewakili elemen dalam array, oleh karena itu kolom tunggal di GridView.

Saat menampilkan data dengan GridView, saya lebih suka secara eksplisit menentukan kolom saya daripada membuatnya secara implisit dihasilkan oleh GridView. Dengan secara eksplisit menentukan kolom, jauh lebih mudah untuk memformat data, mengatur ulang kolom, dan melakukan tugas umum lainnya. Oleh karena itu, mari kita perbarui markup deklaratif GridView sehingga kolomnya ditentukan secara eksplisit.

Mulailah dengan mengatur properti GridView AutoGenerateColumns ke False. Selanjutnya, tambahkan TemplateField ke kisi, atur propertinya HeaderText ke Peran, dan konfigurasikan ItemTemplate sehingga menampilkan konten array. Untuk mencapai hal ini, tambahkan kontrol Web Label bernama RoleNameLabel ke ItemTemplate dan ikat propertinya Text ke Container.DataItem.

Properti dan ItemTemplatekonten ini dapat diatur secara deklaratif atau melalui kotak dialog Bidang GridView dan antarmuka Edit Templat. Untuk mencapai kotak dialog Bidang, klik tautan Edit Kolom di Tag Pintar GridView. Selanjutnya, hapus centang pada kotak centang Buat otomatis bidang untuk mengatur AutoGenerateColumns properti ke False, dan tambahkan TemplateField ke GridView, atur propertinya HeaderText ke Peran. Untuk menentukan ItemTemplatekonten, pilih opsi Edit Templat dari Tag Pintar GridView. Seret kontrol Label Web ke ItemTemplate, atur propertinya ID ke RoleNameLabel, dan konfigurasikan pengaturan pengikatan datanya sehingga propertinya Text terikat ke Container.DataItem.

Terlepas dari pendekatan apa yang Anda gunakan, markup deklaratif yang dihasilkan GridView akan terlihat mirip dengan yang berikut ini ketika Anda selesai.

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

Catatan

Konten array ditampilkan menggunakan sintaks <%# Container.DataItem %>pengikatan data . Deskripsi menyeluruh tentang mengapa sintaks ini digunakan saat menampilkan konten array yang terikat ke GridView berada di luar cakupan tutorial ini. Untuk informasi selengkapnya tentang hal ini, lihat Mengikat Array Skalar ke Kontrol Web Data.

Saat ini, RoleList GridView hanya terikat ke daftar peran ketika halaman pertama kali dikunjungi. Kita perlu merefresh kisi setiap kali peran baru ditambahkan. Untuk mencapai hal ini, perbarui CreateRoleButton penanganan aktivitas Tombol Click sehingga memanggil DisplayRolesInGrid metode jika peran baru dibuat.

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

Sekarang ketika pengguna menambahkan peran RoleList baru, GridView menunjukkan peran yang baru ditambahkan pada postback, memberikan umpan balik visual bahwa peran berhasil dibuat. Untuk mengilustrasikan ini, kunjungi ManageRoles.aspx halaman melalui browser dan tambahkan peran bernama Supervisors. Setelah mengklik tombol Buat Peran, postback akan ensue dan kisi akan diperbarui untuk menyertakan Administrator serta peran baru, Supervisor.

Peran Supervisor Telah Ditambahkan

Gambar 6: Peran Supervisor Telah Ditambahkan (Klik untuk melihat gambar ukuran penuh)

Langkah 6: Menghapus Peran

Pada titik ini pengguna dapat membuat peran baru dan melihat semua peran yang ada dari ManageRoles.aspx halaman. Mari kita izinkan pengguna untuk juga menghapus peran. Metode Roles.DeleteRole ini memiliki dua kelebihan beban:

  • DeleteRole(roleName) - menghapus roleName peran. Pengecualian dilemparkan jika peran berisi satu atau beberapa anggota.
  • DeleteRole(roleName, throwOnPopulatedRole) - menghapus roleName peran. Jika throwOnPopulateRole adalah true, maka pengecualian dilemparkan jika peran berisi satu atau beberapa anggota. Jika throwOnPopulateRole adalah false, maka peran dihapus apakah berisi anggota atau tidak. Secara internal, DeleteRole(roleName) metode memanggil DeleteRole(roleName, true).

Metode ini DeleteRole juga akan memberikan pengecualian jika roleName adalah null atau string kosong atau jika roleName berisi koma. Jika roleName tidak ada dalam sistem, DeleteRole gagal secara diam-diam, tanpa menaikkan pengecualian.

Mari kita tambahkan GridView untuk ManageRoles.aspx menyertakan tombol Hapus yang, saat diklik, menghapus peran yang dipilih. Mulailah dengan menambahkan tombol Hapus ke GridView dengan masuk ke kotak dialog Bidang dan menambahkan tombol Hapus, yang terletak di bawah opsi CommandField. Buat tombol Hapus di kolom paling kiri dan atur propertinya DeleteText ke Hapus Peran .

Menambahkan Tombol Hapus ke RoleList GridView

Gambar 7: Tambahkan Tombol Hapus ke RoleList GridView (Klik untuk melihat gambar ukuran penuh)

Setelah menambahkan tombol Hapus, markup deklaratif GridView Anda akan terlihat mirip dengan yang berikut ini:

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

Selanjutnya, buat penanganan aktivitas untuk peristiwa GridView RowDeleting . Ini adalah peristiwa yang dinaikkan pada postback saat tombol Hapus Peran diklik. Tambahkan kode berikut ke penanganan aktivitas tersebut.

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();
}

Kode dimulai dengan mereferensikan RoleNameLabel kontrol Web secara terprogram di baris yang tombol Hapus Perannya diklik. Metode Roles.DeleteRole ini kemudian dipanggil, meneruskan Text dari RoleNameLabel dan false, sehingga menghapus peran terlepas dari apakah ada pengguna yang terkait dengan peran tersebut. Terakhir, RoleList GridView di-refresh sehingga peran yang baru saja dihapus tidak lagi muncul di kisi.

Catatan

Tombol Hapus Peran tidak memerlukan konfirmasi apa pun dari pengguna sebelum menghapus peran. Salah satu cara termampu untuk mengonfirmasi tindakan adalah melalui kotak dialog konfirmasi pihak klien. Untuk informasi selengkapnya tentang teknik ini, lihat Menambahkan Konfirmasi Client-Side Saat Menghapus.

Ringkasan

Banyak aplikasi web memiliki aturan otorisasi tertentu atau fungsionalitas tingkat halaman yang hanya tersedia untuk kelas pengguna tertentu. Misalnya, mungkin ada sekumpulan halaman web yang hanya dapat diakses administrator. Daripada mendefinisikan aturan otorisasi ini berdasarkan pengguna demi pengguna, seringkali lebih berguna untuk menentukan aturan berdasarkan peran. Artinya, daripada secara eksplisit memungkinkan pengguna Scott dan Jisun untuk mengakses halaman web administratif, pendekatan yang lebih dapat dipertahankan adalah mengizinkan anggota peran Administrator untuk mengakses halaman-halaman ini, dan kemudian menunjukkan Scott dan Jisun sebagai pengguna milik peran Administrator.

Kerangka kerja Peran memudahkan untuk membuat dan mengelola peran. Dalam tutorial ini kami memeriksa cara mengonfigurasi kerangka kerja Peran untuk menggunakan SqlRoleProvider, yang menggunakan database Microsoft SQL Server sebagai penyimpanan peran. Kami juga membuat halaman web yang mencantumkan peran yang ada dalam sistem dan memungkinkan peran baru dibuat dan yang sudah ada dihapus. Dalam tutorial berikutnya kita akan melihat cara menetapkan pengguna ke peran dan cara menerapkan otorisasi berbasis peran.

Selamat Pemrograman!

Bacaan lebih lanjut

Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:

Tentang Penulis

Scott Mitchell, penulis beberapa buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Scott dapat dijangkau di mitchell@4guysfromrolla.com atau melalui blognya di http://ScottOnWriting.NET.

Terima kasih khusus kepada

Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini termasuk Alicja Maziarz, Suchi Banerjee, dan Teresa Murphy. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, letakkan saya antrean di mitchell@4GuysFromRolla.com