Bagikan melalui


Menetapkan Peran ke Pengguna (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 kemampuan pengujian
  • 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

Dalam tutorial ini kita akan membangun dua halaman ASP.NET untuk membantu mengelola pengguna apa yang termasuk dalam peran apa. Halaman pertama akan mencakup fasilitas untuk melihat pengguna apa yang termasuk dalam peran tertentu, peran apa yang dimiliki pengguna tertentu, dan kemampuan untuk menetapkan atau menghapus pengguna tertentu dari peran tertentu. Di halaman kedua kita akan menambah kontrol CreateUserWizard sehingga menyertakan langkah untuk menentukan peran apa yang dimiliki pengguna yang baru dibuat. Ini berguna dalam skenario di mana administrator dapat membuat akun pengguna baru.

Pengantar

Tutorial sebelumnya memeriksa kerangka kerja Peran dan SqlRoleProvider; kami melihat cara menggunakan Roles kelas untuk membuat, mengambil, dan menghapus peran. Selain membuat dan menghapus peran, kita harus dapat menetapkan atau menghapus pengguna dari peran. Sayangnya, ASP.NET tidak dikirim dengan kontrol Web apa pun untuk mengelola pengguna apa yang termasuk dalam peran apa. Sebaliknya, kita harus membuat halaman ASP.NET kita sendiri untuk mengelola asosiasi ini. Kabar baiknya adalah menambahkan dan menghapus pengguna ke peran cukup mudah. Kelas Roles berisi sejumlah metode untuk menambahkan satu atau beberapa pengguna ke satu atau beberapa peran.

Dalam tutorial ini kita akan membangun dua halaman ASP.NET untuk membantu mengelola pengguna apa yang termasuk dalam peran apa. Halaman pertama akan mencakup fasilitas untuk melihat pengguna apa yang termasuk dalam peran tertentu, peran apa yang dimiliki pengguna tertentu, dan kemampuan untuk menetapkan atau menghapus pengguna tertentu dari peran tertentu. Di halaman kedua kita akan menambah kontrol CreateUserWizard sehingga menyertakan langkah untuk menentukan peran apa yang dimiliki pengguna yang baru dibuat. Ini berguna dalam skenario di mana administrator dapat membuat akun pengguna baru.

Mari kita mulai!

Mencantumkan Apa Yang Dimiliki Pengguna Dari Peran Apa

Urutan bisnis pertama untuk tutorial ini adalah membuat halaman web tempat pengguna dapat ditetapkan ke peran. Sebelum kita khawatir tentang cara menetapkan pengguna ke peran, mari kita terlebih dahulu berkonsentrasi pada cara menentukan pengguna apa yang termasuk dalam peran apa. Ada dua cara untuk menampilkan informasi ini: "berdasarkan peran" atau "oleh pengguna." Kami dapat mengizinkan pengunjung untuk memilih peran dan kemudian menunjukkan kepada mereka semua pengguna yang termasuk dalam peran (tampilan "menurut peran"), atau kami dapat meminta pengunjung untuk memilih pengguna dan kemudian menunjukkan peran yang ditetapkan kepada pengguna tersebut (tampilan "oleh pengguna").

Tampilan "berdasarkan peran" berguna dalam keadaan di mana pengunjung ingin mengetahui sekumpulan pengguna yang termasuk dalam peran tertentu; tampilan "menurut pengguna" sangat ideal ketika pengunjung perlu mengetahui peran pengguna tertentu. Mari kita buat halaman kita menyertakan antarmuka "berdasarkan peran" dan "menurut pengguna".

Kita akan mulai dengan membuat antarmuka "menurut pengguna". Antarmuka ini akan terdiri dari daftar drop-down dan daftar kotak centang. Daftar drop-down akan diisi dengan sekumpulan pengguna dalam sistem; kotak centang akan menghitung peran. Memilih pengguna dari daftar drop-down akan memeriksa peran tersebut milik pengguna. Orang yang mengunjungi halaman kemudian dapat mencentang atau menghapus centang pada kotak centang untuk menambahkan atau menghapus pengguna yang dipilih dari peran terkait.

Catatan

Menggunakan daftar drop-down untuk mencantumkan akun pengguna bukanlah pilihan yang ideal untuk situs web di mana mungkin ada ratusan akun pengguna. Daftar drop-down dirancang untuk memungkinkan pengguna memilih satu item dari daftar opsi yang relatif singkat. Ini dengan cepat menjadi berat seiring bertambahnya jumlah item daftar. Jika Anda membangun situs web yang berpotensi memiliki sejumlah besar akun pengguna, Anda mungkin ingin mempertimbangkan untuk menggunakan antarmuka pengguna alternatif, seperti GridView yang dapat dipaginasi atau antarmuka yang dapat difilter yang mencantumkan permintaan pengunjung untuk memilih surat dan kemudian hanya menunjukkan pengguna yang nama penggunanya dimulai dengan huruf yang dipilih.

Langkah 1: Membangun Antarmuka Pengguna "Menurut Pengguna"

Buka halaman UsersAndRoles.aspx . Di bagian atas halaman, tambahkan kontrol Web Label bernama ActionStatus dan hapus propertinya Text . Kami akan menggunakan Label ini untuk memberikan umpan balik tentang tindakan yang dilakukan, menampilkan pesan seperti, "Tito Pengguna telah ditambahkan ke peran Administrator," atau "Jisun Pengguna telah dihapus dari peran Supervisor." Untuk membuat pesan ini menonjol, atur properti Label CssClass ke "Penting".

<p align="center"> 

     <asp:Label ID="ActionStatus" runat="server" CssClass="Important"></asp:Label> 
</p>

Selanjutnya, tambahkan definisi kelas CSS berikut ke Styles.css lembar gaya:

.Important 
{ 
     font-size: large; 
     color: Red; 
}

Definisi CSS ini menginstruksikan browser untuk menampilkan Label menggunakan font merah besar. Gambar 1 menunjukkan efek ini melalui Designer Visual Studio.

Properti CssClass Label Menghasilkan Font Merah Besar

Gambar 1: Properti Label CssClass Menghasilkan Font Merah Besar (Klik untuk melihat gambar ukuran penuh)

Selanjutnya, tambahkan DropDownList ke halaman, atur propertinya ID ke UserList, dan atur propertinya AutoPostBack ke True. Kami akan menggunakan DropDownList ini untuk mencantumkan semua pengguna dalam sistem. DropDownList ini akan terikat pada kumpulan objek MembershipUser. Karena kami ingin DropDownList menampilkan properti UserName dari objek MembershipUser (dan menggunakannya sebagai nilai item daftar), atur dropDownList DataTextField dan DataValueField properti ke "UserName".

Di bawah DropDownList, tambahkan Repeater bernama UsersRoleList. Repeater ini akan mencantumkan semua peran dalam sistem sebagai serangkaian kotak centang. Tentukan Repeater ItemTemplate menggunakan markup deklaratif berikut:

<asp:Repeater ID="UsersRoleList" runat="server"> 
     <ItemTemplate> 
          <asp:CheckBox runat="server" ID="RoleCheckBox" AutoPostBack="true" 

               Text='<%# Container.DataItem %>' /> 
          <br /> 
     </ItemTemplate> 
</asp:Repeater>

ItemTemplate Markup menyertakan kontrol Web Kotak Centang tunggal bernama RoleCheckBox. Properti CheckBox AutoPostBack diatur ke True dan Text properti terikat ke Container.DataItem. Alasan sintaks pengikatan data hanyalah Container.DataItem karena kerangka kerja Peran mengembalikan daftar nama peran sebagai array string, dan array string inilah yang akan kita ikat ke Repeater. Deskripsi menyeluruh tentang mengapa sintaks ini digunakan untuk menampilkan konten array yang terikat ke kontrol Web data berada di luar cakupan tutorial ini. Untuk informasi selengkapnya tentang hal ini, lihat Mengikat Array Skalar ke Kontrol Web Data.

Pada titik ini markup deklaratif antarmuka "menurut pengguna" Anda akan terlihat mirip dengan yang berikut ini:

<h3>Manage Roles By User</h3> 

<p> 
     <b>Select a User:</b> 
     <asp:DropDownList ID="UserList" runat="server" AutoPostBack="True" 
          DataTextField="UserName" DataValueField="UserName"> 

     </asp:DropDownList> 
</p> 
<p> 
     <asp:Repeater ID="UsersRoleList" runat="server"> 
          <ItemTemplate> 
               <asp:CheckBox runat="server" ID="RoleCheckBox" AutoPostBack="true" 

                    Text='<%# Container.DataItem %>' /> 
               <br /> 
          </ItemTemplate> 
     </asp:Repeater> 
</p>

Kami sekarang siap untuk menulis kode untuk mengikat kumpulan akun pengguna ke DropDownList dan serangkaian peran ke Repeater. Di kelas code-behind halaman, tambahkan metode bernama dan metode lain bernama BindUsersToUserListBindRolesList, menggunakan kode berikut:

private void BindUsersToUserList() 
{ 
     // Get all of the user accounts 
     MembershipUserCollection users = Membership.GetAllUsers(); 
     UserList.DataSource = users; 
     UserList.DataBind(); 
}
 
private void BindRolesToList() 
{ 
     // Get all of the roles 
     string[] roles = Roles.GetAllRoles(); 
     UsersRoleList.DataSource = roles; 
     UsersRoleList.DataBind(); 
}

Metode ini BindUsersToUserList mengambil semua akun pengguna dalam sistem melalui Membership.GetAllUsers metode . Ini mengembalikan MembershipUserCollection objek , yang merupakan kumpulan MembershipUser instans. Koleksi ini kemudian terikat ke UserList DropDownList. Instans MembershipUser yang membentuk koleksi berisi berbagai properti, seperti UserName, , EmailCreationDate, dan IsOnline. Untuk menginstruksikan DropDownList untuk menampilkan nilai UserName properti, pastikan bahwa UserList dropDownList DataTextField dan DataValueField properti telah diatur ke "UserName".

Catatan

Metode Membership.GetAllUsers ini memiliki dua kelebihan beban: satu yang tidak menerima parameter input dan mengembalikan semua pengguna, dan satu yang mengambil nilai bilangan bulat untuk indeks halaman dan ukuran halaman, dan hanya mengembalikan subset pengguna yang ditentukan. Ketika ada sejumlah besar akun pengguna yang ditampilkan dalam elemen antarmuka pengguna yang dapat dipaginasi, kelebihan beban kedua dapat digunakan untuk halaman yang lebih efisien melalui pengguna karena hanya mengembalikan subset akun pengguna yang tepat daripada semuanya.

Metode dimulai BindRolesToList dengan memanggil Roles metode kelas GetAllRoles, yang mengembalikan array string yang berisi peran dalam sistem. Array string ini kemudian terikat ke Repeater.

Akhirnya, kita perlu memanggil kedua metode ini ketika halaman pertama kali dimuat. Tambahkan kode berikut ke penanganan aktivitas Page_Load:

protected void Page_Load(object sender, EventArgs e) 
{ 
     if (!Page.IsPostBack) 
     { 
          // Bind the users and roles 
          BindUsersToUserList(); 
          BindRolesToList(); 
     } 
}

Dengan kode ini di tempat, luangkan waktu sejenak untuk mengunjungi halaman melalui browser; layar Anda akan terlihat mirip dengan Gambar 2. Semua akun pengguna diisi dalam daftar drop-down dan, di bawahnya, setiap peran muncul sebagai kotak centang. Karena kami mengatur AutoPostBack properti DropDownList dan CheckBoxes ke True, mengubah pengguna yang dipilih atau memeriksa atau menghapus centang peran menyebabkan postback. Namun, tidak ada tindakan yang dilakukan karena kami belum menulis kode untuk menangani tindakan ini. Kami akan mengatasi tugas-tugas ini di dua bagian berikutnya.

Halaman Menampilkan Pengguna dan Peran

Gambar 2: Halaman Menampilkan Pengguna dan Peran (Klik untuk melihat gambar ukuran penuh)

Memeriksa Peran milik Pengguna yang Dipilih

Ketika halaman pertama kali dimuat, atau setiap kali pengunjung memilih pengguna baru dari daftar drop-down, kita perlu memperbarui UsersRoleListkotak centang 's sehingga kotak centang peran tertentu dicentang hanya jika pengguna yang dipilih termasuk dalam peran tersebut. Untuk mencapai hal ini, buat metode bernama CheckRolesForSelectedUser dengan kode berikut:

private void CheckRolesForSelectedUser() 
{ 
     // Determine what roles the selected user belongs to 
     string selectedUserName = UserList.SelectedValue; 
     string[] selectedUsersRoles = Roles.GetRolesForUser(selectedUserName); 

     // Loop through the Repeater's Items and check or uncheck the checkbox as needed 

     foreach (RepeaterItem ri in UsersRoleList.Items) 
     { 
          // Programmatically reference the CheckBox 
          CheckBox RoleCheckBox = ri.FindControl("RoleCheckBox") as CheckBox; 
          // See if RoleCheckBox.Text is in selectedUsersRoles 
          if (selectedUsersRoles.Contains<string>(RoleCheckBox.Text)) 
               RoleCheckBox.Checked = true; 
          else 
               RoleCheckBox.Checked = false; 
     } 
}

Kode di atas dimulai dengan menentukan siapa pengguna yang dipilih. Kemudian menggunakan metode kelas GetRolesForUser(userName) Peran untuk mengembalikan serangkaian peran pengguna yang ditentukan sebagai array string. Selanjutnya, item Repeater dijumlahkan dan Kotak Centang setiap item RoleCheckBox dirujuk secara terprogram. Kotak Centang dicentang hanya jika peran yang sesuai dengannya terkandung dalam selectedUsersRoles array string.

Catatan

Sintaks selectedUserRoles.Contains<string>(...) tidak akan dikompilasi jika Anda menggunakan ASP.NET versi 2.0. Metode Contains<string> ini adalah bagian dari pustaka LINQ, yang baru ASP.NET 3.5. Jika Anda masih menggunakan ASP.NET versi 2.0, gunakan metode sebagai gantinyaArray.IndexOf<string>.

Metode CheckRolesForSelectedUser ini perlu dipanggil dalam dua kasus: ketika halaman pertama kali dimuat dan setiap kali UserList indeks yang dipilih DropDownList diubah. Oleh karena itu, panggil metode ini dari penanganan Page_Load aktivitas (setelah panggilan ke BindUsersToUserList dan BindRolesToList). Selain itu, buat penanganan aktivitas untuk peristiwa DropDownList SelectedIndexChanged dan panggil metode ini dari sana.

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

          // Bind the users and roles 
          BindUsersToUserList(); 
          BindRolesToList(); 
          // Check the selected user's roles 
          CheckRolesForSelectedUser(); 
     } 
} 

... 

protected void UserList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
     CheckRolesForSelectedUser(); 
}

Dengan kode ini di tempat, Anda dapat menguji halaman melalui browser. Namun, karena UsersAndRoles.aspx halaman saat ini tidak memiliki kemampuan untuk menetapkan pengguna ke peran, tidak ada pengguna yang memiliki peran. Kami akan membuat antarmuka untuk menetapkan pengguna ke peran dalam sesaat, sehingga Anda dapat mengambil kata saya bahwa kode ini berfungsi dan memverifikasi bahwa itu dilakukan nanti, atau Anda dapat menambahkan pengguna secara manual ke peran dengan menyisipkan rekaman ke dalam aspnet_UsersInRoles tabel untuk menguji fungsi ini sekarang.

Menetapkan dan Menghapus Pengguna dari Peran

Saat pengunjung memeriksa atau menghapus centang Kotak Centang di UsersRoleList Repeater, kami perlu menambahkan atau menghapus pengguna yang dipilih dari peran yang sesuai. Properti Kotak Centang AutoPostBack saat ini diatur ke True, yang menyebabkan postback kapan saja Kotak Centang di Repeater dicentang atau tidak dicentang. Singkatnya, kita perlu membuat penanganan aktivitas untuk peristiwa CheckBox CheckChanged . Karena CheckBox berada dalam kontrol Repeater, kita perlu menambahkan pipa penanganan aktivitas secara manual. Mulailah dengan menambahkan penanganan aktivitas ke kelas code-behind sebagai protected metode, seperti:

protected void RoleCheckBox_CheckChanged(object sender, EventArgs e) 
{ 

}

Kami akan kembali untuk menulis kode untuk penanganan aktivitas ini dalam sesaat. Tapi pertama-tama mari kita selesaikan acara penanganan pipa pipa. Dari Kotak Centang dalam Repeater ItemTemplate, tambahkan OnCheckedChanged="RoleCheckBox_CheckChanged". Sintaks ini menghubungkan RoleCheckBox_CheckChanged penanganan aktivitas ke RoleCheckBoxCheckedChanged peristiwa.

<asp:CheckBox runat="server" ID="RoleCheckBox" 
     AutoPostBack="true" 
     Text='<%# Container.DataItem %>' 
     OnCheckedChanged="RoleCheckBox_CheckChanged" />

Tugas terakhir kami adalah menyelesaikan penanganan RoleCheckBox_CheckChanged aktivitas. Kita perlu mulai dengan mereferensikan kontrol CheckBox yang menaikkan peristiwa karena instans CheckBox ini memberi tahu kami peran apa yang diperiksa atau tidak dicentang melalui Text properti dan Checked . Dengan menggunakan informasi ini bersama dengan Nama Pengguna pengguna yang dipilih, kami menambahkan atau menghapus pengguna dari peran melalui Roles kelas AddUserToRole atau RemoveUserFromRole metode .

protected void RoleCheckBox_CheckChanged(object sender, EventArgs e) 
{ 
     // Reference the CheckBox that raised this event 
     CheckBox RoleCheckBox = sender as CheckBox; 

     // Get the currently selected user and role 
     string selectedUserName = UserList.SelectedValue; 

     string roleName = RoleCheckBox.Text; 

     // Determine if we need to add or remove the user from this role 
     if (RoleCheckBox.Checked) 
     { 
          // Add the user to the role 
          Roles.AddUserToRole(selectedUserName, roleName); 
          // Display a status message 
          ActionStatus.Text = string.Format("User {0} was added to role {1}.", selectedUserName, roleName); 
     } 
     else 
     { 
          // Remove the user from the role 
          Roles.RemoveUserFromRole(selectedUserName, roleName); 
          // Display a status message 
          ActionStatus.Text = string.Format("User {0} was removed from role {1}.", selectedUserName, roleName); 

     } 
}

Kode di atas dimulai dengan merujuk secara terprogram CheckBox yang menaikkan peristiwa, yang tersedia melalui sender parameter input. Jika Kotak Centang dicentang, pengguna yang dipilih ditambahkan ke peran yang ditentukan, jika tidak, mereka akan dihapus dari peran. Dalam kedua kasus, ActionStatus Label menampilkan pesan yang meringkas tindakan yang baru saja dilakukan.

Luangkan waktu sejenak untuk menguji halaman ini melalui browser. Pilih pengguna Tito lalu tambahkan Tito ke peran Administrator dan Supervisor.

Tito Telah Ditambahkan ke Peran Administrator dan Supervisor

Gambar 3: Tito Telah Ditambahkan ke Peran Administrator dan Supervisor (Klik untuk melihat gambar ukuran penuh)

Selanjutnya, pilih Bruce pengguna dari daftar drop-down. Ada postback dan Kotak Centang Repeater diperbarui melalui CheckRolesForSelectedUser. Karena Bruce belum termasuk dalam peran apa pun, kedua kotak centang tidak dicentang. Selanjutnya, tambahkan Bruce ke peran Supervisor.

Bruce Telah Ditambahkan ke Peran Supervisor

Gambar 4: Bruce Telah Ditambahkan ke Peran Supervisor (Klik untuk melihat gambar ukuran penuh)

Untuk memverifikasi lebih lanjut fungsionalitas CheckRolesForSelectedUser metode, pilih pengguna selain Tito atau Bruce. Perhatikan bagaimana kotak centang secara otomatis tidak dicentang, menunjukkan bahwa kotak centang tersebut bukan milik peran apa pun. Kembali ke Tito. Kotak centang Administrator dan Supervisor harus dicentang.

Langkah 2: Membangun Antarmuka Pengguna "Menurut Peran"

Pada titik ini kami telah menyelesaikan antarmuka "oleh pengguna" dan siap untuk mulai mengatasi antarmuka "berdasarkan peran". Antarmuka "menurut peran" meminta pengguna untuk memilih peran dari daftar drop-down lalu menampilkan kumpulan pengguna yang termasuk dalam peran tersebut dalam GridView.

Tambahkan kontrol DropDownList lain ke UsersAndRoles.aspx halaman. Tempatkan yang satu ini di bawah kontrol Repeater, beri RoleListnama , dan atur propertinya AutoPostBack ke True. Di bawahnya, tambahkan GridView dan beri RolesUserListnama . GridView ini akan mencantumkan pengguna milik peran yang dipilih. Atur properti GridView AutoGenerateColumns ke False, tambahkan TemplateField ke koleksi kisi Columns , dan atur propertinya HeaderText ke "Pengguna". Tentukan TemplateField ItemTemplate sehingga menampilkan nilai ekspresi Container.DataItem pengikatan data di Text properti Label bernama UserNameLabel.

Setelah menambahkan dan mengonfigurasi GridView, markup deklaratif antarmuka "berdasarkan peran" Anda akan terlihat mirip dengan yang berikut ini:

<h3>Manage Users By Role</h3> 
<p> 
     <b>Select a Role:</b> 

     <asp:DropDownList ID="RoleList" runat="server" AutoPostBack="true"></asp:DropDownList> 
</p> 
<p>      <asp:GridView ID="RolesUserList" runat="server" AutoGenerateColumns="false" 

          EmptyDataText="No users belong to this role."> 
          <Columns> 
               <asp:TemplateField HeaderText="Users"> 
                    <ItemTemplate> 
                         <asp:Label runat="server" id="UserNameLabel" 
                              Text='<%# Container.DataItem %>'></asp:Label> 

                    </ItemTemplate> 
               </asp:TemplateField> 
          </Columns> 
     </asp:GridView> </p>

Kita perlu mengisi RoleList DropDownList dengan serangkaian peran dalam sistem. Untuk mencapai hal ini, perbarui BindRolesToList metode sehingga mengikat array string yang dikembalikan oleh Roles.GetAllRoles metode ke RolesList DropDownList (serta UsersRoleList Repeater).

private void BindRolesToList() 
{ 
     // Get all of the roles 

     string[] roles = Roles.GetAllRoles(); 
     UsersRoleList.DataSource = roles; 
     UsersRoleList.DataBind(); 

     RoleList.DataSource = roles; 
     RoleList.DataBind(); 
}

Dua baris terakhir dalam BindRolesToList metode telah ditambahkan untuk mengikat serangkaian peran ke RoleList kontrol DropDownList. Gambar 5 menunjukkan hasil akhir saat dilihat melalui browser – daftar drop-down yang diisi dengan peran sistem.

Peran Ditampilkan di Daftar DropDownList RoleList

Gambar 5: Peran Ditampilkan di RoleList DropDownList (Klik untuk melihat gambar ukuran penuh)

Menampilkan Pengguna Yang Termasuk Dalam Peran yang Dipilih

Ketika halaman pertama kali dimuat, atau ketika peran baru dipilih dari RoleList DropDownList, kita perlu menampilkan daftar pengguna yang termasuk dalam peran tersebut di GridView. Buat metode bernama DisplayUsersBelongingToRole menggunakan kode berikut:

private void DisplayUsersBelongingToRole() 
{ 
     // Get the selected role 
     string selectedRoleName = RoleList.SelectedValue; 

     // Get the list of usernames that belong to the role 
     string[] usersBelongingToRole = Roles.GetUsersInRole(selectedRoleName); 

     // Bind the list of users to the GridView 
     RolesUserList.DataSource = usersBelongingToRole; 
     RolesUserList.DataBind(); 
}

Metode ini dimulai dengan mendapatkan peran yang dipilih dari RoleList DropDownList. Kemudian menggunakan Roles.GetUsersInRole(roleName) metode untuk mengambil array string dari UserNames pengguna yang termasuk dalam peran tersebut. Array ini kemudian terikat ke RolesUserList GridView.

Metode ini perlu dipanggil dalam dua keadaan: ketika halaman awalnya dimuat dan ketika peran yang dipilih dalam RoleList DropDownList berubah. Oleh karena itu, perbarui Page_Load penanganan aktivitas sehingga metode ini dipanggil setelah panggilan ke CheckRolesForSelectedUser. Selanjutnya, buat penanganan aktivitas untuk RoleListacara , SelectedIndexChanged dan panggil metode ini dari sana juga.

protected void Page_Load(object sender, EventArgs e) 
{ 
     if (!Page.IsPostBack) 
     { 
          // Bind the users and roles 
          BindUsersToUserList(); 
          BindRolesToList(); 

          // Check the selected user's roles 
          CheckRolesForSelectedUser(); 

          // Display those users belonging to the currently selected role 
          DisplayUsersBelongingToRole(); 
     } 
} 

... 

protected void RoleList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
     DisplayUsersBelongingToRole(); 
}

Dengan kode ini di tempat, RolesUserList GridView harus menampilkan pengguna yang termasuk dalam peran yang dipilih. Seperti yang ditunjukkan Oleh Gambar 6, peran Supervisor terdiri dari dua anggota: Bruce dan Tito.

GridView Mencantumkan Pengguna Yang Termasuk Dalam Peran yang Dipilih

Gambar 6: GridView Mencantumkan Pengguna Yang Termasuk Dalam Peran yang Dipilih (Klik untuk melihat gambar ukuran penuh)

Menghapus Pengguna dari Peran yang Dipilih

Mari kita tambahkan RolesUserList GridView sehingga menyertakan kolom tombol "Hapus". Mengklik tombol "Hapus" untuk pengguna tertentu akan menghapusnya dari peran tersebut.

Mulailah dengan menambahkan bidang tombol Hapus ke GridView. Buat bidang ini muncul sebagai yang paling kiri diajukan dan ubah propertinya DeleteText dari "Hapus" (default) menjadi "Hapus".

Cuplikan layar yang memperlihatkan cara menambahkan tombol

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

Saat tombol "Hapus" diklik setelah postback muncul dan peristiwa GridView RowDeleting dinaikkan. Kita perlu membuat penanganan aktivitas untuk peristiwa ini dan menulis kode yang menghapus pengguna dari peran yang dipilih. Buat penanganan aktivitas lalu tambahkan kode berikut:

protected void RolesUserList_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
     // Get the selected role 
     string selectedRoleName = RoleList.SelectedValue; 

     // Reference the UserNameLabel 
     Label UserNameLabel = RolesUserList.Rows[e.RowIndex].FindControl("UserNameLabel") as Label; 

     // Remove the user from the role 
     Roles.RemoveUserFromRole(UserNameLabel.Text, selectedRoleName); 

     // Refresh the GridView 
     DisplayUsersBelongingToRole(); 

     // Display a status message 
     ActionStatus.Text = string.Format("User {0} was removed from role {1}.", UserNameLabel.Text, selectedRoleName); 
}

Kode dimulai dengan menentukan nama peran yang dipilih. Kemudian secara terprogram mereferensikan UserNameLabel kontrol dari baris yang tombol "Hapus" diklik untuk menentukan Nama Pengguna pengguna yang akan dihapus. Pengguna kemudian dihapus dari peran melalui panggilan ke Roles.RemoveUserFromRole metode . RolesUserList GridView kemudian disegarkan dan pesan ditampilkan melalui ActionStatus kontrol Label.

Catatan

Tombol "Hapus" tidak memerlukan konfirmasi apa pun dari pengguna sebelum menghapus pengguna dari peran. Saya mengundang Anda untuk menambahkan beberapa tingkat konfirmasi pengguna. 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.

Gambar 8 memperlihatkan halaman setelah pengguna Tito dihapus dari grup Supervisor.

Sayangnya, Tito Bukan Lagi Supervisor

Gambar 8: Sayangnya, Tito Bukan Lagi Supervisor (Klik untuk melihat gambar ukuran penuh)

Menambahkan Pengguna Baru ke Peran yang Dipilih

Seiring dengan menghapus pengguna dari peran yang dipilih, pengunjung ke halaman ini juga harus dapat menambahkan pengguna ke peran yang dipilih. Antarmuka terbaik untuk menambahkan pengguna ke peran yang dipilih tergantung pada jumlah akun pengguna yang anda harapkan. Jika situs web Anda hanya akan menampung beberapa lusin akun pengguna atau kurang, Anda dapat menggunakan DropDownList di sini. Jika mungkin ada ribuan akun pengguna, Anda ingin menyertakan antarmuka pengguna yang mengizinkan pengunjung untuk halaman melalui akun, mencari akun tertentu, atau memfilter akun pengguna dengan cara lain.

Untuk halaman ini mari kita gunakan antarmuka yang sangat sederhana yang berfungsi terlepas dari jumlah akun pengguna dalam sistem. Yaitu, kami akan menggunakan TextBox, meminta pengunjung untuk mengetikkan nama pengguna pengguna yang ingin ditambahkan ke peran yang dipilih. Jika tidak ada pengguna dengan nama tersebut, atau jika pengguna sudah menjadi anggota peran, kami akan menampilkan pesan di ActionStatus Label. Tetapi jika pengguna ada dan bukan anggota peran, kami akan menambahkan mereka ke peran dan me-refresh kisi.

Tambahkan Kotak Teks dan Tombol di bawah GridView. Atur TextBox ID ke UserNameToAddToRole dan atur tombol ID dan Text properti masing-masing ke AddUserToRoleButton dan "Tambahkan Pengguna ke Peran".

<p> 
     <b>UserName:</b> 
     <asp:TextBox ID="UserNameToAddToRole" runat="server"></asp:TextBox> 
     <br /> 
     <asp:Button ID="AddUserToRoleButton" runat="server" Text="Add User to Role" /> 

</p>

Selanjutnya, buat Click penanganan aktivitas untuk AddUserToRoleButton dan tambahkan kode berikut:

protected void AddUserToRoleButton_Click(object sender, EventArgs e) 
{ 
     // Get the selected role and username 

     string selectedRoleName = RoleList.SelectedValue; 
     string userNameToAddToRole = UserNameToAddToRole.Text; 

     // Make sure that a value was entered 
     if (userNameToAddToRole.Trim().Length == 0) 
     { 
          ActionStatus.Text = "You must enter a username in the textbox."; 
          return; 
     } 

     // Make sure that the user exists in the system 
     MembershipUser userInfo = Membership.GetUser(userNameToAddToRole); 
     if (userInfo == null) 
     { 
          ActionStatus.Text = string.Format("The user {0} does not exist in the system.", userNameToAddToRole); 

          return; 
     } 

     // Make sure that the user doesn't already belong to this role 
     if (Roles.IsUserInRole(userNameToAddToRole, selectedRoleName)) 
     { 
          ActionStatus.Text = string.Format("User {0} already is a member of role {1}.", userNameToAddToRole, selectedRoleName); 
          return; 
     } 

     // If we reach here, we need to add the user to the role 
     Roles.AddUserToRole(userNameToAddToRole, selectedRoleName); 

     // Clear out the TextBox 
     UserNameToAddToRole.Text = string.Empty; 

     // Refresh the GridView 
     DisplayUsersBelongingToRole(); 

     // Display a status message 

     ActionStatus.Text = string.Format("User {0} was added to role {1}.", userNameToAddToRole, selectedRoleName); }

Sebagian besar kode dalam penanganan Click aktivitas melakukan berbagai pemeriksaan validasi. Ini memastikan bahwa pengunjung menyediakan nama pengguna di UserNameToAddToRole TextBox, bahwa pengguna ada dalam sistem, dan bahwa mereka belum termasuk dalam peran yang dipilih. Jika salah satu pemeriksaan ini gagal, pesan yang sesuai ditampilkan di ActionStatus dan penanganan aktivitas keluar. Jika semua pemeriksaan lolos, pengguna ditambahkan ke peran melalui Roles.AddUserToRole metode . Setelah itu, properti TextBox Text dibersihkan, GridView disegarkan, dan ActionStatus Label menampilkan pesan yang menunjukkan bahwa pengguna yang ditentukan berhasil ditambahkan ke peran yang dipilih.

Catatan

Untuk memastikan bahwa pengguna yang ditentukan belum termasuk dalam peran yang dipilih, kami menggunakan Roles.IsUserInRole(userName, roleName) metode , yang mengembalikan nilai Boolean yang menunjukkan apakah userName adalah anggota roleName. Kita akan menggunakan metode ini lagi dalam tutorial berikutnya ketika kita melihat otorisasi berbasis peran.

Kunjungi halaman melalui browser dan pilih peran Supervisor dari RoleList DropDownList. Coba masukkan nama pengguna yang tidak valid - Anda akan melihat pesan yang menjelaskan bahwa pengguna tidak ada di sistem.

Anda Tidak Dapat Menambahkan Pengguna yang Tidak Ada ke Peran

Gambar 9: Anda Tidak Dapat Menambahkan Pengguna yang Tidak Ada ke Peran (Klik untuk melihat gambar ukuran penuh)

Sekarang coba tambahkan pengguna yang valid. Lanjutkan dan tambahkan kembali Tito ke peran Supervisor.

Tito Sekali Lagi Jadi Supervisor!

Gambar 10: Tito Sekali Lagi Menjadi Supervisor! (Klik untuk melihat gambar ukuran penuh)

Langkah 3: Memperbarui Silang Antarmuka "Menurut Pengguna" dan "Menurut Peran"

Halaman ini UsersAndRoles.aspx menawarkan dua antarmuka yang berbeda untuk mengelola pengguna dan peran. Saat ini, kedua antarmuka ini bertindak independen satu sama lain sehingga ada kemungkinan bahwa perubahan yang dilakukan dalam satu antarmuka tidak akan segera tercermin di antarmuka lainnya. Misalnya, bayangkan pengunjung ke halaman memilih peran Supervisor dari RoleList DropDownList, yang mencantumkan Bruce dan Tito sebagai anggotanya. Selanjutnya, pengunjung memilih Tito dari UserList DropDownList, yang memeriksa kotak centang Administrator dan Supervisor di UsersRoleList Repeater. Jika pengunjung kemudian menghapus centang peran Supervisor dari Repeater, Tito dihapus dari peran Supervisor, tetapi modifikasi ini tidak tercermin dalam antarmuka "berdasarkan peran". GridView masih akan menampilkan Tito sebagai anggota peran Supervisor.

Untuk memperbaikinya, kita perlu merefresh GridView setiap kali peran diperiksa atau tidak dicentang dari UsersRoleList Repeater. Demikian juga, kita perlu me-refresh Repeater setiap kali pengguna dihapus atau ditambahkan ke peran dari antarmuka "berdasarkan peran".

Repeater di antarmuka "menurut pengguna" di-refresh dengan memanggil CheckRolesForSelectedUser metode . Antarmuka "berdasarkan peran" dapat dimodifikasi di RolesUserList penanganan aktivitas GridView RowDeleting dan AddUserToRoleButton penanganan aktivitas Tombol Click . Oleh karena itu, kita perlu memanggil CheckRolesForSelectedUser metode dari masing-masing metode ini.

protected void RolesUserList_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
     ... Code removed for brevity ... 

     // Refresh the "by user" interface 
     CheckRolesForSelectedUser(); 
} 

protected void AddUserToRoleButton_Click(object sender, EventArgs e) 
{ 
     ... Code removed for brevity ... 


     // Refresh the "by user" interface 
     CheckRolesForSelectedUser(); 
}

Demikian pula, GridView di antarmuka "berdasarkan peran" disegarkan dengan memanggil DisplayUsersBelongingToRole metode dan antarmuka "oleh pengguna" dimodifikasi melalui RoleCheckBox_CheckChanged penanganan aktivitas. Oleh karena itu, kita perlu memanggil DisplayUsersBelongingToRole metode dari penanganan aktivitas ini.

protected void RoleCheckBox_CheckChanged(object sender, EventArgs e) 
{ 
     ... Code removed for brevity... 

     // Refresh the "by role" interface 
     DisplayUsersBelongingToRole(); 
}

Dengan perubahan kode kecil ini, antarmuka "oleh pengguna" dan "berdasarkan peran" sekarang diperbarui secara silang dengan benar. Untuk memverifikasi ini, kunjungi halaman melalui browser dan pilih Tito dan Supervisor dari UserList dan RoleList DropDownLists, masing-masing. Perhatikan bahwa saat Anda menghapus centang peran Supervisor untuk Tito dari Repeater di antarmuka "oleh pengguna", Tito secara otomatis dihapus dari GridView di antarmuka "menurut peran". Menambahkan Tito kembali ke peran Supervisor dari antarmuka "menurut peran" secara otomatis memeriksa kembali kotak centang Supervisor di antarmuka "menurut pengguna".

Langkah 4: Menyesuaikan CreateUserWizard untuk Menyertakan Langkah "Tentukan Peran"

Dalam tutorial Membuat Akun Pengguna, kami melihat cara menggunakan kontrol Web CreateUserWizard untuk menyediakan antarmuka untuk membuat akun pengguna baru. Kontrol CreateUserWizard dapat digunakan dengan salah satu dari dua cara:

  • Sebagai sarana bagi pengunjung untuk membuat akun pengguna mereka sendiri di situs, dan
  • Sebagai sarana bagi administrator untuk membuat akun baru

Dalam kasus penggunaan pertama, pengunjung datang ke situs dan mengisi CreateUserWizard, memasukkan informasi mereka untuk mendaftar di situs. Dalam kasus kedua, administrator membuat akun baru untuk orang lain.

Ketika akun sedang dibuat oleh administrator untuk beberapa orang lain, mungkin berguna untuk mengizinkan administrator menentukan peran apa yang dimiliki akun pengguna baru. Dalam tutorial MenyimpanInformasi Pengguna Tambahan, kami melihat cara menyesuaikan CreateUserWizard dengan menambahkan tambahan WizardSteps. Mari kita lihat cara menambahkan langkah tambahan ke CreateUserWizard untuk menentukan peran pengguna baru.

CreateUserWizardWithRoles.aspx Buka halaman dan tambahkan kontrol CreateUserWizard bernama RegisterUserWithRoles. Atur properti kontrol ContinueDestinationPageUrl ke "~/Default.aspx". Karena idenya di sini adalah bahwa administrator akan menggunakan kontrol CreateUserWizard ini untuk membuat akun pengguna baru, atur properti kontrol LoginCreatedUser ke False. Properti ini LoginCreatedUser menentukan apakah pengunjung secara otomatis masuk sebagai pengguna yang baru saja dibuat, dan defaultnya ke True. Kami mengaturnya ke False karena ketika administrator membuat akun baru, kami ingin membuatnya tetap masuk sebagai dirinya sendiri.

Selanjutnya, pilih "Tambahkan/Hapus WizardSteps..." opsi dari Tag Pintar CreateUserWizard dan tambahkan yang baru WizardStep, atur ID ke SpecifyRolesStep. Pindahkan SpecifyRolesStep WizardStep sehingga muncul setelah langkah "Daftar untuk Akun Baru Anda", tetapi sebelum langkah "Selesai". Atur WizardStepproperti 's Title ke "Tentukan Peran", propertinya StepType ke Step, dan propertinya AllowReturn ke False.

Cuplikan layar yang memperlihatkan properti Tentukan Peran yang dipilih di jendela Editor Koleksi Langkah Wizard.

Gambar 11: Tambahkan "Tentukan Peran" WizardStep ke CreateUserWizard (Klik untuk melihat gambar ukuran penuh)

Setelah ini, ubah markup deklaratif CreateUserWizard Anda akan terlihat seperti berikut ini:

<asp:CreateUserWizard ID="RegisterUserWithRoles" runat="server" 
     ContinueDestinationPageUrl="~/Default.aspx" LoginCreatedUser="False"> 

     <WizardSteps> 
          <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server"> 
          </asp:CreateUserWizardStep> 
          <asp:WizardStep ID="SpecifyRolesStep" runat="server" StepType="Step" 

               Title="Specify Roles" AllowReturn="False"> 
          </asp:WizardStep> 
          <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server"> 
          </asp:CompleteWizardStep> 
     </WizardSteps> 

</asp:CreateUserWizard>

Di "Tentukan Peran" WizardStep, tambahkan CheckBoxList bernama RoleList. CheckBoxList ini akan mencantumkan peran yang tersedia, memungkinkan orang yang mengunjungi halaman untuk memeriksa peran apa yang baru dibuat pengguna.

Kita dibiarkan dengan dua tugas pengodean: pertama kita harus mengisi RoleList CheckBoxList dengan peran dalam sistem; kedua, kita perlu menambahkan pengguna yang dibuat ke peran yang dipilih ketika pengguna berpindah dari langkah "Tentukan Peran" ke langkah "Selesai". Kita dapat menyelesaikan tugas pertama di penanganan Page_Load aktivitas. Kode berikut secara terprogram mereferensikan RoleList CheckBox pada kunjungan pertama ke halaman dan mengikat peran dalam sistem ke dalamnya.

protected void Page_Load(object sender, EventArgs e) 
{ 
     if (!Page.IsPostBack) 
     { 
          // Reference the SpecifyRolesStep WizardStep 
          WizardStep SpecifyRolesStep = RegisterUserWithRoles.FindControl("SpecifyRolesStep") as WizardStep; 

          // Reference the RoleList CheckBoxList 
          CheckBoxList RoleList = SpecifyRolesStep.FindControl("RoleList") as CheckBoxList; 

          // Bind the set of roles to RoleList 
          RoleList.DataSource = Roles.GetAllRoles(); 
          RoleList.DataBind(); 
     } 
}

Kode di atas akan terlihat familier. Dalam tutorial MenyimpanInformasi Pengguna Tambahan, kami menggunakan dua FindControl pernyataan untuk mereferensikan kontrol Web dari dalam kustom WizardStep. Dan kode yang mengikat peran ke CheckBoxList diambil dari sebelumnya dalam tutorial ini.

Untuk melakukan tugas pemrograman kedua, kita perlu mengetahui kapan langkah "Tentukan Peran" telah selesai. Ingat bahwa CreateUserWizard memiliki ActiveStepChanged peristiwa, yang diaktifkan setiap kali pengunjung menavigasi dari satu langkah ke langkah lainnya. Di sini kita dapat menentukan apakah pengguna telah mencapai langkah "Selesai"; jika demikian, kita perlu menambahkan pengguna ke peran yang dipilih.

Buat penanganan aktivitas untuk ActiveStepChanged peristiwa dan tambahkan kode berikut:

protected void RegisterUserWithRoles_ActiveStepChanged(object sender, EventArgs e) 
{ 
     // Have we JUST reached the Complete step? 
     if (RegisterUserWithRoles.ActiveStep.Title == "Complete") 
     { 
          // Reference the SpecifyRolesStep WizardStep 
          WizardStep SpecifyRolesStep = RegisterUserWithRoles.FindControl("SpecifyRolesStep") as WizardStep; 

          // Reference the RoleList CheckBoxList 
          CheckBoxList RoleList = SpecifyRolesStep.FindControl("RoleList") as CheckBoxList; 

          // Add the checked roles to the just-added user 
          foreach (ListItem li in RoleList.Items) 

          { 
               if (li.Selected) 
                    Roles.AddUserToRole(RegisterUserWithRoles.UserName, li.Text); 
          } 
     } 
}

Jika pengguna baru saja mencapai langkah "Selesai", penanganan aktivitas menghitung item CheckBoxList RoleList dan pengguna yang baru dibuat ditetapkan ke peran yang dipilih.

Kunjungi halaman ini melalui browser. Langkah pertama dalam langkah CreateUserWizard adalah langkah standar "Daftar untuk Akun Baru Anda", yang meminta nama pengguna, kata sandi, email, dan informasi kunci pengguna baru. Masukkan informasi untuk membuat pengguna baru bernama Wanda.

Buat Pengguna Baru Bernama Wanda

Gambar 12: Buat Pengguna Baru Bernama Wanda (Klik untuk melihat gambar ukuran penuh)

Klik tombol "Buat Pengguna". CreateUserWizard secara internal memanggil Membership.CreateUser metode , membuat akun pengguna baru, lalu maju ke langkah berikutnya, "Tentukan Peran." Di sini peran sistem tercantum. Centang kotak Centang Supervisor dan klik Berikutnya.

Jadikan Wanda Sebagai Anggota Peran Supervisor

Gambar 13: Jadikan Wanda Anggota Peran Supervisor (Klik untuk melihat gambar ukuran penuh)

Mengklik Berikutnya menyebabkan postback dan memperbarui ActiveStep ke langkah "Selesai". Di penanganan ActiveStepChanged aktivitas, akun pengguna yang baru dibuat ditetapkan ke peran Supervisor. Untuk memverifikasi ini, kembali ke UsersAndRoles.aspx halaman dan pilih Supervisor dari RoleList DropDownList. Seperti yang ditunjukkan Oleh Gambar 14, Supervisor sekarang terdiri dari tiga pengguna: Bruce, Tito, dan Wanda.

Bruce, Tito, dan Wanda adalah Semua Supervisor

Gambar 14: Bruce, Tito, dan Wanda adalah Semua Supervisor (Klik untuk melihat gambar ukuran penuh)

Ringkasan

Kerangka kerja Peran menawarkan metode untuk mengambil informasi tentang peran dan metode pengguna tertentu untuk menentukan pengguna apa yang termasuk dalam peran tertentu. Selain itu, ada sejumlah metode untuk menambahkan dan menghapus satu atau beberapa pengguna ke satu atau beberapa peran. Dalam tutorial ini kami hanya berfokus pada dua metode ini: AddUserToRole dan RemoveUserFromRole. Ada varian tambahan yang dirancang untuk menambahkan beberapa pengguna ke satu peran dan untuk menetapkan beberapa peran ke satu pengguna.

Tutorial ini juga menyertakan tampilan memperluas kontrol CreateUserWizard untuk menyertakan WizardStep untuk menentukan peran pengguna yang baru dibuat. Langkah seperti itu dapat membantu administrator menyederhanakan proses pembuatan akun pengguna untuk pengguna baru.

Pada titik ini kita telah melihat cara membuat dan menghapus peran dan cara menambahkan dan menghapus pengguna dari peran. Tetapi kita belum melihat penerapan otorisasi berbasis peran. Dalam tutorial berikut, kita akan melihat mendefinisikan aturan otorisasi URL berdasarkan peran demi peran, serta cara membatasi fungsionalitas tingkat halaman berdasarkan peran pengguna yang saat ini masuk.

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 independen, pelatih, dan penulis. 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 untuk...

Seri tutorial ini ditinjau oleh banyak peninjau yang membantu. Peninjau prospek untuk tutorial ini adalah Teresa Murphy. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, menjatuhkan saya baris di mitchell@4GuysFromRolla.com