Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.
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 BindUsersToUserList
BindRolesList
, 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
, , Email
CreationDate
, 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.
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 UsersRoleList
kotak 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 RoleCheckBox
CheckedChanged
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.
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.
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 RoleList
nama , dan atur propertinya AutoPostBack
ke True. Di bawahnya, tambahkan GridView dan beri RolesUserList
nama . 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.
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 RoleList
acara , 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.
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".
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.
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.
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.
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 WizardStep
properti 's Title
ke "Tentukan Peran", propertinya StepType
ke Step
, dan propertinya AllowReturn
ke False.
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.
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.
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.
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