Kullanıcılara Rol Atama (C#)Assigning Roles to Users (C#)

Scott Mitchell tarafındanby Scott Mitchell

Kodu indirin veya PDF 'yi indirinDownload Code or Download PDF

Bu öğreticide, kullanıcıların hangi rollere ait olduğunu yönetmeye yardımcı olmak için iki ASP.NET sayfası oluşturacağız.In this tutorial we will build two ASP.NET pages to assist with managing what users belong to what roles. İlk sayfa, hangi kullanıcıların belirli bir role ait olduğunu, belirli bir kullanıcının hangi rollere ait olduğunu ve belirli bir rolün belirli bir rolü atama veya kaldırma olanağını görmek için tesis içerir.The first page will include facilities to see what users belong to a given role, what roles a particular user belongs to, and the ability to assign or remove a particular user from a particular role. İkinci sayfada, yeni oluşturulan kullanıcının hangi rollere ait olduğunu belirleyen bir adım içerecek şekilde CreateUserWizard denetimini geliştireceğiz.In the second page we will augment the CreateUserWizard control so that it includes a step to specify what roles the newly created user belongs to. Bu, yöneticinin yeni kullanıcı hesapları oluşturabilebileceği senaryolarda faydalıdır.This is useful in scenarios where an administrator is able to create new user accounts.

GirişIntroduction

Önceki öğreticide , rol çatısı ve SqlRoleProviderincelendi. rolleri oluşturmak, almak ve silmek için Roles sınıfını nasıl kullanacağınızı gördük.The previous tutorial examined the Roles framework and the SqlRoleProvider; we saw how to use the Roles class to create, retrieve, and delete roles. Rolleri oluşturmanın ve silmenin yanı sıra, bir role Kullanıcı atayabilmeniz veya kaldırabilmemiz gerekir.In addition to creating and deleting roles, we need to be able to assign or remove users from a role. Ne yazık ki ASP.NET, kullanıcıların hangi rollere ait olduğunu yönetmek için herhangi bir Web denetimleriyle birlikte gelmez.Unfortunately, ASP.NET does not ship with any Web controls for managing what users belong to what roles. Bunun yerine, bu ilişkilendirmeleri yönetmek için kendi ASP.NET sayfalarınızın oluşturulması gerekir.Instead, we must create our own ASP.NET pages to manage these associations. İyi haber, kullanıcıları rollere eklemek ve kaldırmak oldukça kolaydır.The good news is that adding and removing users to roles is quite easy. Roles sınıfı bir veya daha fazla role bir veya daha fazla kullanıcı eklemek için bir dizi yöntem içerir.The Roles class contains a number of methods for adding one or more users to one or more roles.

Bu öğreticide, kullanıcıların hangi rollere ait olduğunu yönetmeye yardımcı olmak için iki ASP.NET sayfası oluşturacağız.In this tutorial we will build two ASP.NET pages to assist with managing what users belong to what roles. İlk sayfa, hangi kullanıcıların belirli bir role ait olduğunu, belirli bir kullanıcının hangi rollere ait olduğunu ve belirli bir rolün belirli bir rolü atama veya kaldırma olanağını görmek için tesis içerir.The first page will include facilities to see what users belong to a given role, what roles a particular user belongs to, and the ability to assign or remove a particular user from a particular role. İkinci sayfada, yeni oluşturulan kullanıcının hangi rollere ait olduğunu belirleyen bir adım içerecek şekilde CreateUserWizard denetimini geliştireceğiz.In the second page we will augment the CreateUserWizard control so that it includes a step to specify what roles the newly created user belongs to. Bu, yöneticinin yeni kullanıcı hesapları oluşturabilebileceği senaryolarda faydalıdır.This is useful in scenarios where an administrator is able to create new user accounts.

Haydi başlayın!Let's get started!

Hangi kullanıcıların hangi rollere ait olduğunu listelemeListing What Users Belong To What Roles

Bu öğreticide ilk iş sırası, kullanıcıların rollere atanabileceği bir Web sayfası oluşturmaktır.The first order of business for this tutorial is to create a web page from which users can be assigned to roles. Kullanıcılara rolleri nasıl atayacağınızı kendimize konusunda endişelenmemiz için öncelikle hangi kullanıcıların hangi rollere ait olduğunu belirleme konusunda odaklanalım.Before we concern ourselves with how to assign users to roles, let's first concentrate on how to determine what users belong to what roles. Bu bilgileri görüntülemenin iki yolu vardır: "role göre" veya "Kullanıcı tarafından".There are two ways to display this information: "by role" or "by user." Ziyaretçinin bir rol seçmesini ve sonra bu rolü role ait tüm kullanıcıları ("role göre" görüntülemesi) göstermesini ve ardından ziyaretçinin bir Kullanıcı seçmesini ve ardından bu kullanıcıya atanan rolleri ("Kullanıcı tarafından" görüntülemesi) göstermesini istemiz.We could allow the visitor to select a role and then show them all of the users that belong to the role (the "by role" display), or we could prompt the visitor to select a user and then show them the roles assigned to that user (the "by user" display).

"Role göre" görünümü, ziyaretçinin belirli bir role ait olan kullanıcılar kümesini bilmek istediği koşullarda yararlıdır; "Kullanıcı tarafından" görünümü, ziyaretçi belirli bir kullanıcının rolünü bilmeleri gerektiğinde idealdir.The "by role" view is useful in circumstances where the visitor wants to know the set of users that belong to a particular role; the "by user" view is ideal when the visitor needs to know a particular user's role(s). Sayfamıza hem "role göre" hem de "Kullanıcı tarafından" arabirimleri dahil edelim.Let's have our page include both "by role" and "by user" interfaces.

"Kullanıcı tarafından" arabirimi oluşturmaya başlayacağız.We will start with creating the "by user" interface. Bu arabirim, açılan bir listeden ve onay listesi listesinden oluşur.This interface will consist of a drop-down list and a list of checkboxes. Açılan liste, sistemdeki kullanıcı kümesiyle doldurulur; onay kutuları, rolleri numaralandıracaktır.The drop-down list will be populated with the set of users in the system; the checkboxes will enumerate the roles. Açılır listeden bir kullanıcı seçildiğinde, kullanıcının ait olduğu roller kontrol edilir.Selecting a user from the drop-down list will check those roles the user belongs to. Sayfayı ziyaret eden kişi, seçilen kullanıcıyı ilgili rollerden eklemek veya kaldırmak için onay kutularını denetleyebilir veya işaretini kaldırabilir.The person visiting the page can then check or uncheck the checkboxes to add or remove the selected user from the corresponding roles.

Note

Kullanıcı hesaplarını listelemek için açılan bir liste kullanmak, yüzlerce Kullanıcı hesabının olabileceği Web siteleri için ideal bir seçenek değildir.Using a drop-down list to list the user accounts is not an ideal choice for websites where there may be hundreds of user accounts. Bir açılan liste, kullanıcının görece bir seçenek listesinden bir öğe seçmesine olanak tanımak için tasarlanmıştır.A drop-down list is designed to allow a user to pick one item from a relatively short list of options. Liste öğelerinin sayısı arttıkça hızlı bir şekilde hale gelir.It quickly becomes unwieldy as the number of list items grows. Potansiyel olarak çok sayıda kullanıcı hesabı olacak bir Web sitesi oluşturuyorsanız, disk belleğine alınabilir GridView veya filtrelenebilir bir arabirim gibi farklı bir kullanıcı arabirimi kullanmayı düşünmek isteyebilirsiniz. Bu, ziyaretçilerin bir harf seçmesini ve sonra yalnızca Kullanıcı adı seçili harfle başlayan kullanıcıları gösterir.If you are building a website that will have potentially large numbers of user accounts, you may want to consider using an alternative user interface, such as a pageable GridView or a filterable interface that lists prompts the visitor to choose a letter and then only shows those users whose username starts with the selected letter.

1. Adım: "Kullanıcı tarafından" Kullanıcı arabirimini oluşturmaStep 1: Building the "By User" User Interface

UsersAndRoles.aspx sayfasını açın.Open the UsersAndRoles.aspx page. Sayfanın üst kısmında, ActionStatus adlı bir etiket Web denetimi ekleyin ve Text özelliğini temizleyin.At the top of the page, add a Label Web control named ActionStatus and clear out its Text property. Bu etiketi, gerçekleştirilen eylemler hakkında geri bildirim sağlamak, "Yöneticiler rolüne kullanıcı Tito eklendi" veya "Kullanıcı Jisun, ana bilgisayar rolünden kaldırılmadı" gibi iletileri görüntülemek için kullanacağız.We will use this Label to provide feedback on the actions performed, displaying messages like, "User Tito has been added to the Administrators role," or "User Jisun has been removed from the Supervisors role." Bu iletilerin öne çıkmasını sağlamak için etiketin CssClass özelliğini "önemli" olarak ayarlayın.In order to make these messages stand out, set the Label's CssClass property to "Important".

<p align="center"> 

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

Sonra, aşağıdaki CSS sınıfı tanımını Styles.css stil sayfasına ekleyin:Next, add the following CSS class definition to the Styles.css stylesheet:

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

Bu CSS tanımı, tarayıcıya büyük ve kırmızı bir yazı tipi kullanarak etiketi görüntülemesini söyler.This CSS definition instructs the browser to display the Label using a large, red font. Şekil 1 ' de bu efekt Visual Studio Tasarımcısı aracılığıyla gösterilmiştir.Figure 1 shows this effect through the Visual Studio Designer.

Etiketin CssClass özelliği büyük ve kırmızı bir yazı tipiyle sonuçlanıyor The Label's CssClass Property Results in a Large, Red Font

Şekil 1: etiketin CssClass özelliği büyük ve kırmızı bir yazı tipiyle sonuçlanıyor (tam boyutlu görüntüyü görüntülemek için tıklatın)Figure 1: The Label's CssClass Property Results in a Large, Red Font (Click to view full-size image)

Sonra, sayfaya bir DropDownList ekleyin, ID özelliğini UserListolarak ayarlayın ve AutoPostBack özelliğini true olarak ayarlayın.Next, add a DropDownList to the page, set its ID property to UserList, and set its AutoPostBack property to True. Bu DropDownList 'i sistemdeki tüm kullanıcıları listelemek için kullanacağız.We will use this DropDownList to list all of the users in the system. Bu DropDownList, bir MembershipUser nesneleri koleksiyonuna bağlanacak.This DropDownList will be bound to a collection of MembershipUser objects. DropDownList 'in, MembershipUser nesnesinin UserName özelliğini göstermesini istiyoruz (ve bunu liste öğelerinin değeri olarak kullanın), DropDownList 'in DataTextField ve DataValueField özelliklerini "UserName" olarak ayarlayın.Because we want the DropDownList to display the UserName property of the MembershipUser object (and use it as the value of the list items), set the DropDownList's DataTextField and DataValueField properties to "UserName".

DropDownList 'in altında, UsersRoleListadlı bir yineleyici ekleyin.Underneath the DropDownList, add a Repeater named UsersRoleList. Bu Yineleyici, sistemdeki tüm rolleri bir dizi onay kutusu olarak listeler.This Repeater will list all of the roles in the system as a series of checkboxes. Yineleyicisi 'nin ItemTemplate aşağıdaki bildirim temelli biçimlendirmeyi kullanarak tanımlayın:Define the Repeater's ItemTemplate using the following declarative markup:

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

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

ItemTemplate biçimlendirmesi, RoleCheckBoxadlı tek bir CheckBox Web denetimini içerir.The ItemTemplate markup includes a single CheckBox Web control named RoleCheckBox. CheckBox 'ın AutoPostBack özelliği true olarak ayarlanır ve Text özelliği Container.DataItem'e bağlanır.The CheckBox's AutoPostBack property is set to True and the Text property is bound to Container.DataItem. Veri bağlama sözdiziminin Container.DataItem nedeni, rol çerçevesinin rol adları listesini bir dize dizisi olarak döndürmesi ve bu dize dizisi, yineleyici öğesine bağlamamız olacaktır.The reason the databinding syntax is simply Container.DataItem is because the Roles framework returns the list of role names as a string array, and it is this string array that we will be binding to the Repeater. Bu sözdiziminin, bir veri Web denetimine yönelik bir dizinin içeriğini göstermek için nasıl kullanıldığına ilişkin kapsamlı bir açıklama, Bu öğreticinin kapsamının dışındadır.A thorough description of why this syntax is used to display the contents of an array bound to a data Web control is beyond the scope of this tutorial. Bu konuyla ilgili daha fazla bilgi için, bir skalar diziyi veri Web denetimine bağlamakonusuna bakın.For more information on this matter, refer to Binding a Scalar Array to a Data Web Control.

Bu noktada, "kullanıcıya göre" arabiriminin bildirime dayalı biçimlendirmesi aşağıdakine benzer görünmelidir:At this point your "by user" interface's declarative markup should look similar to the following:

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

Artık Kullanıcı hesaplarının kümesini DropDownList 'e ve roller kümesini Repeater 'a bağlamak için kodu yazmaya hazırsınız.We are now ready to write the code to bind the set of user accounts to the DropDownList and the set of roles to the Repeater. Sayfanın arka plan kod sınıfında, aşağıdaki kodu kullanarak BindUsersToUserList adlı bir yöntemi ve başka bir adlandırılmış BindRolesListekleyin:In the page's code-behind class, add a method named BindUsersToUserList and another named BindRolesList, using the following code:

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

BindUsersToUserList yöntemi, Membership.GetAllUsers yöntemiaracılığıyla sistemdeki tüm Kullanıcı hesaplarını alır.The BindUsersToUserList method retrieves all of the user accounts in the system via the Membership.GetAllUsers method. Bu, bir MembershipUser örneklerikoleksiyonu olan MembershipUserCollection nesnesinidöndürür.This returns a MembershipUserCollection object, which is a collection of MembershipUser instances. Bu koleksiyon daha sonra UserList DropDownList 'e bağlanır.This collection is then bound to the UserList DropDownList. Koleksiyonu oluşturan MembershipUser örnekleri, UserName, Email, CreationDateve IsOnlinegibi çeşitli özellikler içerir.The MembershipUser instances that makeup the collection contain a variety of properties, like UserName, Email, CreationDate, and IsOnline. DropDownList 'in UserName özelliğinin değerini göstermesini söylemek için UserList DropDownList 'in DataTextField ve DataValueField özelliklerinin "UserName" olarak ayarlandığından emin olun.In order to instruct the DropDownList to display the value of the UserName property, ensure that the UserList DropDownList's DataTextField and DataValueField properties have been set to "UserName".

Note

Membership.GetAllUsers yönteminin iki aşırı yüklemesi vardır: giriş parametresi yok kabul eden ve tüm kullanıcıları ve sayfa dizini ve sayfa boyutu için tamsayı değerlerini alan ve yalnızca belirtilen kullanıcıların alt kümesini döndüren bir tane.The Membership.GetAllUsers method has two overloads: one that accepts no input parameters and returns all of the users, and one that takes in integer values for the page index and page size, and returns only the specified subset of the users. Çok sayıda kullanıcı hesabı, disk belleğine alınabilen bir kullanıcı arabirimi öğesinde görüntülenirken, ikinci aşırı yükleme, Kullanıcı hesaplarının yalnızca tam alt kümesini döndürdüğünden, bunların tümünün yerine daha verimli bir şekilde görüntülenmesini sağlamak için kullanılabilir.When there are large amounts of user accounts being displayed in a pageable user interface element, the second overload can be used to more efficiently page through the users since it returns just the precise subset of user accounts rather than all of them.

BindRolesToList yöntemi, sistem içindeki rolleri içeren bir dize dizisi döndüren Roles sınıfının GetAllRoles yönteminiçağırarak başlar.The BindRolesToList method starts by calling the Roles class's GetAllRoles method, which returns a string array containing the roles in the system. Bu dize dizisi daha sonra yineleyicisi 'ne bağlanır.This string array is then bound to the Repeater.

Son olarak, sayfa ilk yüklendiğinde bu iki yöntemi çağırmalıdır.Finally, we need to call these two methods when the page is first loaded. Page_Load olay işleyicisine aşağıdaki kodu ekleyin:Add the following code to the Page_Load event handler:

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

Bu kodla birlikte, bir tarayıcı aracılığıyla sayfayı ziyaret etmek için bir dakikanızı ayırın; ekranınızın Şekil 2 ' ye benzer olması gerekir.With this code in place, take a moment to visit the page through a browser; your screen should look similar to Figure 2. Tüm Kullanıcı hesapları açılan listede doldurulur ve altında her bir rol onay kutusu olarak görünür.All of the user accounts are populated in the drop-down list and, underneath that, each role appears as a checkbox. DropDownList ve CheckBox 'ın AutoPostBack özelliklerini true olarak belirlediğimiz için, seçilen kullanıcıyı değiştirmek veya bir rolü denetlemek ya da kaldırmak geri göndermeye neden olur.Because we set the AutoPostBack properties of the DropDownList and CheckBoxes to True, changing the selected user or checking or unchecking a role causes a postback. Ancak, bu eylemleri işlemek için henüz kod yazdığımız için hiçbir eylem yapılmaz.No action is performed, however, because we have yet to write code to handle these actions. Sonraki iki bölümde bu görevleri ele alacağız.We'll tackle these tasks in the next two sections.

, Kullanıcı ve rolleri görüntüleyen sayfaThe Page Displays the Users and Roles

Şekil 2: sayfada kullanıcılar ve roller görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 2: The Page Displays the Users and Roles (Click to view full-size image)

Seçilen kullanıcının ait olduğu roller denetleniyorChecking the Roles the Selected User Belongs To

Sayfa ilk yüklendiğinde veya ziyaretçi aşağı açılan listeden yeni bir Kullanıcı seçtiğinde, belirli bir rol onay kutusunun yalnızca seçili Kullanıcı söz konusu role aitse denetlenmesi için UsersRoleListonay kutularını güncelleştirmemiz gerekir.When the page is first loaded, or whenever the visitor selects a new user from the drop-down list, we need to update the UsersRoleList's checkboxes so that a given role checkbox is checked only if the selected user belongs to that role. Bunu gerçekleştirmek için aşağıdaki kodla CheckRolesForSelectedUser adlı bir yöntem oluşturun:To accomplish this, create a method named CheckRolesForSelectedUser with the following code:

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

Yukarıdaki kod, seçilen kullanıcının kim olduğunu belirleyerek başlar.The above code starts by determining who the selected user is. Daha sonra, belirtilen kullanıcının roller kümesini dize dizisi olarak döndürmek için rol sınıfının GetRolesForUser(userName) yöntemini kullanır.It then uses the Roles class's GetRolesForUser(userName) method to return the specified user's set of roles as a string array. Sonra, yineleyicisi 'nin öğeleri numaralandırılır ve her bir öğenin RoleCheckBox onay kutusu programlama yoluyla başvurulur.Next, the Repeater's items are enumerated and each item's RoleCheckBox CheckBox is programmatically referenced. Onay kutusu yalnızca karşılık gelen rolün selectedUsersRoles dize dizisi içinde yer alıyorsa denetlenir.The CheckBox is checked only if the role it corresponds to is contained within the selectedUsersRoles string array.

Note

selectedUserRoles.Contains<string>(...) sözdizimi, ASP.NET sürüm 2,0 kullanıyorsanız derlenmeyecektir.The selectedUserRoles.Contains<string>(...) syntax will not compile if you are using ASP.NET version 2.0. Contains<string> yöntemi, ASP.NET 3,5 ' de yeni olan LINQ kitaplığı'nın bir parçasıdır.The Contains<string> method is part of the LINQ library, which is new to ASP.NET 3.5. Hala ASP.NET sürüm 2,0 kullanıyorsanız, bunun yerine Array.IndexOf<string> yöntemini kullanın.If you are still using ASP.NET version 2.0, use the Array.IndexOf<string> method instead.

CheckRolesForSelectedUser yönteminin iki durumda çağrılması gerekir: sayfa ilk yüklendiğinde ve UserList DropDownList 'in seçili dizini değiştirildiğinde her seferinde.The CheckRolesForSelectedUser method needs to be called in two cases: when the page is first loaded and whenever the UserList DropDownList's selected index is changed. Bu nedenle, Page_Load olay işleyiciden bu yöntemi çağırın (BindUsersToUserList ve BindRolesToListçağrılarından sonra).Therefore, call this method from the Page_Load event handler (after the calls to BindUsersToUserList and BindRolesToList). Ayrıca, DropDownList 'in SelectedIndexChanged olayı için bir olay işleyicisi oluşturun ve bu yöntemi buradan çağırın.Also, create an event handler for the DropDownList's SelectedIndexChanged event and call this method from there.

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

Bu kodla birlikte, sayfayı tarayıcı üzerinden test edebilirsiniz.With this code in place, you can test the page through the browser. Ancak, UsersAndRoles.aspx sayfası şu anda rollere kullanıcı atama yeteneği olmadığından, hiçbir kullanıcı role sahip değildir.However, since the UsersAndRoles.aspx page currently lacks the ability to assign users to roles, no users have roles. Kullanıcılara bir süre içinde Kullanıcı atamaya yönelik bir arabirim oluşturacağız. bu nedenle, bu kodun çalıştığı Sözcüklerimi alabilir ve daha sonra bu işlevi test etmek için aspnet_UsersInRoles tabloya kayıtları ekleyerek el ile roller ekleyebilirsiniz.We will create the interface for assigning users to roles in a moment, so you can either take my word that this code works and verify that it does so later, or you can manually add users to roles by inserting records into the aspnet_UsersInRoles table in order to test this functionality now.

Rollerden Kullanıcı atama ve kaldırmaAssigning and Removing Users from Roles

Ziyaretçi UsersRoleList Yineleyici içindeki bir onay kutusunu denetlediğinde veya denetlediğinde, Seçili kullanıcıyı ilgili role eklemesi veya kaldırması gerekir.When the visitor checks or unchecks a CheckBox in the UsersRoleList Repeater we need to add or remove the selected user from the corresponding role. CheckBox 'ın AutoPostBack özelliği şu anda true olarak ayarlanmıştır. Bu, bir geri göndermeye her zaman yineleyici onay kutusu işaretli veya işaretlenmemiş olarak neden olur.The CheckBox's AutoPostBack property is currently set to True, which causes a postback anytime a CheckBox in the Repeater is checked or unchecked. Kısaca, CheckBox 'ın CheckChanged olayı için bir olay işleyicisi oluşturuyoruz.In short, we need to create an event handler for the CheckBox's CheckChanged event. Onay kutusu bir yineleyici denetiminde olduğundan, olay işleyicisi sıhhi tesisat 'yi el ile eklememiz gerekiyor.Since the CheckBox is in a Repeater control, we need to manually add the event handler plumbing. Olay işleyicisini, bir protected yöntemi olarak, bu şekilde arka plan kod sınıfına ekleyerek başlayın:Start by adding the event handler to the code-behind class as a protected method, like so:

protected void RoleCheckBox_CheckChanged(object sender, EventArgs e) 
{ 

}

Bu olay işleyicisine yönelik kodu bir süre içinde yazmak için geri dönebiliyoruz.We will return to write the code for this event handler in a moment. Ancak ilk olarak olay işleme sıhhi tesisat 'yi tamamlayalim.But first let's complete the event handling plumbing. Yineleyicisi 'nin ItemTemplateiçindeki onay kutusundan OnCheckedChanged="RoleCheckBox_CheckChanged"ekleyin.From the CheckBox within the Repeater's ItemTemplate, add OnCheckedChanged="RoleCheckBox_CheckChanged". Bu söz dizimi RoleCheckBox_CheckChanged olay işleyicisini RoleCheckBox``CheckedChanged olayına kablolar.This syntax wires the RoleCheckBox_CheckChanged event handler to the RoleCheckBox's CheckedChanged event.

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

Son göreviniz RoleCheckBox_CheckChanged olay işleyicisini tamammız.Our final task is to complete the RoleCheckBox_CheckChanged event handler. Bu onay kutusu örneği, Text ve Checked özellikleri aracılığıyla hangi rolün işaretli veya işaretlenmemiş olduğunu bize söylerken, olayı oluşturan CheckBox denetimine başvurarak başlatmamız gerekiyor.We need to start by referencing the CheckBox control that raised the event because this CheckBox instance tells us what role was checked or unchecked via its Text and Checked properties. Seçilen kullanıcının Kullanıcı adı ile birlikte bu bilgileri kullanarak, Roles sınıfın AddUserToRole veya RemoveUserFromRole yöntemiaracılığıyla Kullanıcı ekleme veya rol çıkardık.Using this information along with the UserName of the selected user, we add or remove the user from the role via the Roles class's AddUserToRole or RemoveUserFromRole method.

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

     } 
}

Yukarıdaki kod, sender giriş parametresi aracılığıyla kullanılabilir olan olayı oluşturan onay kutusuna programlı bir şekilde gönderilir.The above code starts by programmatically referencing the CheckBox that raised the event, which is available via the sender input parameter. Onay kutusu işaretliyse, seçilen kullanıcı belirtilen role eklenir, aksi takdirde rolden kaldırılır.If the CheckBox is checked, the selected user is added to the specified role, otherwise they are removed from the role. Her iki durumda da ActionStatus etiketi, az önce gerçekleştirilen eylemi özetleyen bir ileti görüntüler.In either case, the ActionStatus Label displays a message summarizing the action just performed.

Bu sayfayı bir tarayıcı ile test etmek için bir dakikanızı ayırın.Take a moment to test out this page through a browser. Kullanıcı Tito ' ı seçin ve ardından hem Yöneticiler hem de süper yönetici rollerine Tito ' ı ekleyin.Select user Tito and then add Tito to both the Administrators and Supervisors roles.

Tito, Yöneticiler ve süper yönetici rollerine eklenmiştirTito Has Been Added to the Administrators and Supervisors Roles

Şekil 3: yönetim ve süper yönetici rollerine Tito eklendi (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 3: Tito Has Been Added to the Administrators and Supervisors Roles (Click to view full-size image)

Sonra, açılan listeden Kullanıcı deneme tarafı ' nı seçin.Next, select user Bruce from the drop-down list. Bir geri gönderme işlemi ve yineleyicisi 'nin onay kutuları CheckRolesForSelectedUseraracılığıyla güncelleştirilir.There is a postback and the Repeater's CheckBoxes are updated via the CheckRolesForSelectedUser. Deneme CE hiçbir role ait olmadığından, iki onay kutusu işaretlenmemiştir.Since Bruce does not yet belong to any roles, the two checkboxes are unchecked. Ardından, süper vizörler rolüne bir deneme yanılması ekleyin.Next, add Bruce to the Supervisors role.

deneme süresi, süper vizörler rolüne eklendiBruce Has Been Added to the Supervisors Role

Şekil 4: deneme süresi, süper vizörler rolüne eklendi (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 4: Bruce Has Been Added to the Supervisors Role (Click to view full-size image)

CheckRolesForSelectedUser yönteminin işlevlerini daha fazla doğrulamak için, Tito veya Bruce dışında bir kullanıcı seçin.To further verify the functionality of the CheckRolesForSelectedUser method, select a user other than Tito or Bruce. Onay kutularının, hiçbir role ait olmadığını belirten otomatik olarak işaretlenmediğini not edin.Note how the checkboxes are automatically unchecked, denoting that they do not belong to any roles. Tito 'ya geri dönün.Return to Tito. Hem Yöneticiler hem de süper vizörler onay kutuları denetlenmelidir.Both the Administrators and Supervisors checkboxes should be checked.

2. Adım: "roller tarafından" Kullanıcı arabirimini oluşturmaStep 2: Building the "By Roles" User Interface

Bu noktada, "kullanıcılar tarafından" arabirimini tamamladık ve "rollere göre" arabirimine göz atın.At this point we have completed the "by users" interface and are ready to start tackling the "by roles" interface. "Rol ölçütü" arabirimi, kullanıcıdan bir açılan listeden bir rol seçmesini ve ardından GridView içinde bu role ait olan kullanıcı kümesini görüntüler.The "by roles" interface prompts the user to select a role from a drop-down list and then displays the set of users that belong to that role in a GridView.

UsersAndRoles.aspx sayfasına başka bir DropDownList denetimi ekleyin.Add another DropDownList control to the UsersAndRoles.aspx page. Bunu Yineleyici denetiminin altına yerleştirin, RoleListadlandırın ve AutoPostBack özelliğini true olarak ayarlayın.Place this one beneath the Repeater control, name it RoleList, and set its AutoPostBack property to True. Bunun altında, bir GridView ekleyip RolesUserListadlandırın.Underneath that, add a GridView and name it RolesUserList. Bu GridView, seçili role ait olan kullanıcıları listeler.This GridView will list the users that belong to the selected role. GridView 'ın AutoGenerateColumns özelliğini false olarak ayarlayın, Grid 'in Columns koleksiyonuna bir TemplateField ekleyin ve HeaderText özelliğini "Users" olarak ayarlayın.Set the GridView's AutoGenerateColumns property to False, add a TemplateField to the grid's Columns collection, and set its HeaderText property to "Users". TemplateField 'ın ItemTemplate, UserNameLabeladlı bir etiketin Text özelliğinde Container.DataItem veri bağlama ifadesinin değerini görüntüleyecek şekilde tanımlayın.Define the TemplateField's ItemTemplate so that it displays the value of the databinding expression Container.DataItem in the Text property of a Label named UserNameLabel.

GridView eklendikten ve yapılandırıldıktan sonra, "role göre" arabiriminin bildirim temelli biçimlendirmesi aşağıdakine benzer olmalıdır:After adding and configuring the GridView, your "by role" interface's declarative markup should look similar to the following:

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

RoleList DropDownList öğesini sistemdeki roller kümesiyle doldurmamız gerekir.We need to populate the RoleList DropDownList with the set of roles in the system. Bunu gerçekleştirmek için BindRolesToList yöntemini, Roles.GetAllRoles yöntemi tarafından döndürülen dize dizisini RolesList DropDownList 'e (Ayrıca UsersRoleList Yineleyici) bağlayan şekilde güncelleştirin.To accomplish this, update the BindRolesToList method so that is binds the string array returned by the Roles.GetAllRoles method to the RolesList DropDownList (as well as the UsersRoleList Repeater).

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

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

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

BindRolesToList yöntemi içindeki son iki satır, rol kümesini RoleList DropDownList denetimine bağlamak için eklenmiştir.The last two lines in the BindRolesToList method have been added to bind the set of roles to the RoleList DropDownList control. Şekil 5 ' te, bir tarayıcıdan görüntülendiklerinde son sonuç gösterilir. bir açılan liste, sistem rolleriyle doldurulur.Figure 5 shows the end result when viewed through a browser – a drop-down list populated with the system's roles.

roller RoleList DropDownList içinde görüntülenirThe Roles are Displayed in the RoleList DropDownList

Şekil 5: roller RoleList DropDownList 'de görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 5: The Roles are Displayed in the RoleList DropDownList (Click to view full-size image)

Seçili role ait olan kullanıcıları görüntülemeDisplaying the Users That Belong To the Selected Role

Sayfa ilk yüklendiğinde veya RoleList DropDownList 'den yeni bir rol seçildiğinde, GridView 'da bu role ait olan kullanıcıların listesini görüntüliyoruz.When the page is first loaded, or when a new role is selected from the RoleList DropDownList, we need to display the list of users that belong to that role in the GridView. Aşağıdaki kodu kullanarak DisplayUsersBelongingToRole adlı bir yöntem oluşturun:Create a method named DisplayUsersBelongingToRole using the following code:

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

Bu yöntem, seçili rolü RoleList DropDownList 'den alarak başlatılır.This method starts by getting the selected role from the RoleList DropDownList. Daha sonra bu role ait olan kullanıcıların kullanıcı adlarının dize dizisini almak için Roles.GetUsersInRole(roleName) yöntemini kullanır.It then uses the Roles.GetUsersInRole(roleName) method to retrieve a string array of the UserNames of the users that belong to that role. Daha sonra bu dizi RolesUserList GridView 'a bağlanır.This array is then bound to the RolesUserList GridView.

Bu yöntemin iki durumda çağrılması gerekir: sayfa başlangıçta yüklendiğinde ve RoleList DropDownList içindeki seçili rol değiştiğinde.This method needs to be called in two circumstances: when the page is initially loaded and when the selected role in the RoleList DropDownList changes. Bu nedenle, bu yöntemin CheckRolesForSelectedUserçağrısından sonra çağrılması için Page_Load olay işleyicisini güncelleştirin.Therefore, update the Page_Load event handler so that this method is invoked after the call to CheckRolesForSelectedUser. Sonra, RoleList``SelectedIndexChanged olayı için bir olay işleyicisi oluşturun ve bu yöntemi buradan da çağırın.Next, create an event handler for the RoleList's SelectedIndexChanged event, and call this method from there, too.

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

Bu kodla birlikte RolesUserList GridView, seçili role ait olan kullanıcıları görüntülemelidir.With this code in place, the RolesUserList GridView should display those users that belong to the selected role. Şekil 6 ' da gösterildiği gibi, süper vizörler rolü iki üyeden oluşur: deneme sürümü ve Tito.As Figure 6 shows, the Supervisors role consists of two members: Bruce and Tito.

GridView seçili role ait olan kullanıcıları listelerThe GridView Lists Those Users That Belong to the Selected Role

Şekil 6: GridView, seçili role ait olan kullanıcıları listeler (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 6: The GridView Lists Those Users That Belong to the Selected Role (Click to view full-size image)

Kullanıcılar seçili rolden kaldırılıyorRemoving Users from the Selected Role

RolesUserList GridView 'ı, "Kaldır" düğmelerinin bir sütununu içerecek şekilde kullanalım.Let's augment the RolesUserList GridView so that it includes a column of "Remove" buttons. Belirli bir kullanıcı için "Kaldır" düğmesine tıklamak bu rolden kaldıracaktır.Clicking the "Remove" button for a particular user will remove them from that role.

GridView 'a bir Delete düğmesi alanı ekleyerek başlayın.Start by adding a Delete button field to the GridView. Bu alanın en son dosyalanmış olarak görünmesini sağlayın ve DeleteText özelliğini "Sil" (varsayılan) olarak "Kaldır" olarak değiştirin.Make this field appear as the left most filed and change its DeleteText property from "Delete" (the default) to "Remove".

ekleyinAdd the

Şekil 7: GridView 'A "Kaldır" düğmesini ekleme (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 7: Add the "Remove" Button to the GridView (Click to view full-size image)

"Kaldır" düğmesine tıklandığında bir geri gönderme işlemi başarılı olur ve GridView 'un RowDeleting olayı tetiklenir.When the "Remove" button is clicked a postback ensues and the GridView's RowDeleting event is raised. Bu olay için bir olay işleyicisi oluşturmalı ve Kullanıcı seçili rolden kaldıran kod yazmaktır.We need to create an event handler for this event and write code that removes the user from the selected role. Olay işleyicisini oluşturun ve ardından aşağıdaki kodu ekleyin:Create the event handler and then add the following code:

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

Kod, seçilen rol adı belirlenerek başlar.The code starts by determining the selected role name. Daha sonra, kaldırılacak kullanıcının Kullanıcı adını öğrenmek için, "Kaldır" düğmesine tıklanan satırdan UserNameLabel denetimine programlı bir şekilde başvurur.It then programmatically references the UserNameLabel control from the row whose "Remove" button was clicked in order to determine the UserName of the user to remove. Daha sonra Kullanıcı Roles.RemoveUserFromRole metoduna yapılan bir çağrı aracılığıyla rolden kaldırılır.The user is then removed from the role via a call to the Roles.RemoveUserFromRole method. RolesUserList GridView daha sonra yenilenir ve bir ileti ActionStatus etiketi denetimi aracılığıyla görüntülenir.The RolesUserList GridView is then refreshed and a message is displayed via the ActionStatus Label control.

Note

"Kaldır" düğmesi kullanıcıdan Kullanıcı kaldırılmadan önce herhangi bir onay sıralaması gerektirmez.The "Remove" button does not require any sort of confirmation from the user before removing the user from the role. Size bazı Kullanıcı onay düzeyi eklemenizi davet ediyorum.I invite you to add some level of user confirmation. Bir eylemi onaylamaya yönelik en kolay yollarından biri, istemci tarafı onaylama iletişim kutusunu kullanmaktır.One of the easiest ways to confirm an action is through a client-side confirm dialog box. Bu teknik hakkında daha fazla bilgi için bkz. silerken Istemci tarafı onaylama ekleme.For more information on this technique, see Adding Client-Side Confirmation When Deleting.

Şekil 8 ' de, kullanıcı denetimli gruptan kaldırıldıktan sonra sayfa görüntülenir.Figure 8 shows the page after user Tito has been removed from the Supervisors group.

alas, artık gözetmen yokAlas, Tito is No Longer a Supervisor

Şekil 8: alas, Tito artık bir gözetmen değil (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 8: Alas, Tito is No Longer a Supervisor (Click to view full-size image)

Yeni kullanıcılar seçili role ekleniyorAdding New Users to the Selected Role

Kullanıcıları seçili rolden kaldırmanın yanı sıra, bu sayfaya ziyaretçi de seçili role bir Kullanıcı ekleyebilmelidir.Along with removing users from the selected role, the visitor to this page should also be able to add a user to the selected role. Seçili role bir kullanıcı eklemek için en iyi arabirim, sahip olmasını istediğiniz kullanıcı hesabı sayısına bağlıdır.The best interface for adding a user to the selected role depends on the number of user accounts you expect to have. Web siteniz yalnızca birkaç düzine Kullanıcı hesabını veya daha az bir kullanıcı hesabı barındırabilir, burada bir DropDownList kullanabilirsiniz.If your website will house just a few dozen user accounts or less, you could use a DropDownList here. Binlerce kullanıcı hesabı söz konusu olduğunda, ziyaretçilerin hesaplar arasında gezinmesine, belirli bir hesabı aramasına veya Kullanıcı hesaplarını başka bir şekilde filtrelemesine izin veren bir kullanıcı arabirimi eklemek istersiniz.If there might be thousands of user accounts, you would want to include a user interface that permits the visitor to page through the accounts, search for a particular account, or filter the user accounts in some other fashion.

Bu sayfada, sistemdeki kullanıcı hesaplarının sayısından bağımsız olarak çalışacak çok basit bir arabirim kullanalım.For this page let's use a very simple interface that works regardless of the number of user accounts in the system. Yani, ziyaretçiye, seçili role eklemek istediği kullanıcının Kullanıcı adını girmesini isteyen bir metin kutusu kullanacağız.Namely, we will use a TextBox, prompting the visitor to type in the username of the user she wants to add to the selected role. Bu adı taşıyan bir kullanıcı yoksa veya Kullanıcı zaten rolün üyesiyse, ActionStatus etiketinde bir ileti görüntüleriz.If no user with that name exists, or if the user is already a member of the role, we'll display a message in ActionStatus Label. Ancak kullanıcı varsa ve rolün bir üyesi değilse, bunları role ekleyecek ve Kılavuzu yeniletireceğiz.But if the user exists and is not a member of the role, we'll add them to the role and refresh the grid.

GridView 'un altına bir TextBox ve düğme ekleyin.Add a TextBox and Button beneath the GridView. TextBox 'ın ID UserNameToAddToRole olarak ayarlayın ve düğmenin ID ve Text özelliklerini sırasıyla AddUserToRoleButton ve "Role Kullanıcı Ekle" olarak ayarlayın.Set the TextBox's ID to UserNameToAddToRole and set the Button's ID and Text properties to AddUserToRoleButton and "Add User to Role", respectively.

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

Sonra, AddUserToRoleButton için Click bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:Next, create a Click event handler for the AddUserToRoleButton and add the following code:

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

Click olay işleyicisindeki kodun çoğunluğu çeşitli doğrulama denetimleri gerçekleştirir.The majority of the code in the Click event handler performs various validation checks. Ziyaretçi UserNameToAddToRole metin kutusuna bir Kullanıcı adı verilmesini, kullanıcının sistemde mevcut olduğunu ve bu kullanıcıların zaten seçili role ait olmamasını sağlar.It ensures that the visitor supplied a username in the UserNameToAddToRole TextBox, that the user exists in the system, and that they don't already belong to the selected role. Bu denetimlerden herhangi biri başarısız olursa, ActionStatus uygun bir ileti görüntülenir ve olay işleyicisine çıkış yapılır.If any of these checks fails, an appropriate message is displayed in ActionStatus and the event handler is exited. Tüm denetimler başarılı olursa, Kullanıcı Roles.AddUserToRole yöntemi aracılığıyla role eklenir.If all of the checks pass, the user is added to the role via the Roles.AddUserToRole method. Bunun ardından, TextBox 'ın Text özelliği temizlenir, GridView yenilenir ve ActionStatus etiketi belirtilen kullanıcının seçili role başarıyla eklendiğini belirten bir ileti görüntüler.Following that, the TextBox's Text property is cleared out, the GridView is refreshed, and the ActionStatus Label displays a message indicating that the specified user was successfully added to the selected role.

Note

Belirtilen kullanıcının seçili role ait olmadığından emin olmak için, Kullanıcı adının roleNameüyesi olup olmadığını gösteren bir Boole değeri döndüren Roles.IsUserInRole(userName, roleName) yönteminikullanırız.To ensure that the specified user does not already belong to the selected role, we use the Roles.IsUserInRole(userName, roleName) method, which returns a Boolean value indicating whether userName is a member of roleName. Rol tabanlı yetkilendirmeye baktığımızda , bu yöntemi sonraki öğreticide yeniden kullanacağız.We will use this method again in the next tutorial when we look at role-based authorization.

Sayfayı bir tarayıcıdan ziyaret edin ve RoleList DropDownList ' den süper vizörler rolünü seçin.Visit the page through a browser and select the Supervisors role from the RoleList DropDownList. Geçersiz Kullanıcı adı girmeyi deneyin – kullanıcının sistemde mevcut olmadığını belirten bir ileti görmeniz gerekir.Try entering an invalid username – you should see a message explaining that the user does not exist in the system.

var olmayan bir kullanıcıyı role ekleyemezsinizYou Cannot Add a Non-Existent User to a Role

Şekil 9: var olmayan bir kullanıcıyı bir role ekleyemezsiniz (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 9: You Cannot Add a Non-Existent User to a Role (Click to view full-size image)

Şimdi geçerli bir Kullanıcı eklemeyi deneyin.Now try adding a valid user. Devam edin ve Supervisors rolüne yeniden ekleyin.Go ahead and re-add Tito to the Supervisors role.

Tito bir kez yeniden gözetmen!Tito Is Once Again a Supervisor!

Şekil 10: Tito bir gözetmen bir kez daha.Figure 10: Tito Is Once Again a Supervisor! (Tam boyutlu görüntüyü görüntülemek Için tıklayın)(Click to view full-size image)

3. Adım: "Kullanıcı tarafından" ve "role göre" arabirimleri için çapraz güncelleştirmeStep 3: Cross-Updating the "By User" and "By Role" Interfaces

UsersAndRoles.aspx sayfası, kullanıcıları ve rolleri yönetmeye yönelik iki ayrı arabirim sunar.The UsersAndRoles.aspx page offers two distinct interfaces for managing users and roles. Şu anda, bu iki arabirim birbirinden bağımsız olarak davranır, böylece bir arabirimde yapılan bir değişiklik diğerinden hemen yansıtılmayacaktır.Currently, these two interfaces act independently of one another so it is possible that a change made in one interface will not be reflected immediately in the other. Örneğin, sayfa ziyaretçisinin, bu RoleList DropDownList 'den, kendi üyeleri olarak ve Tito ' ı listeleyen üst yöneticiler rolünü seçdiğine düşünün.For example, imagine that the visitor to the page selects the Supervisors role from the RoleList DropDownList, which lists Bruce and Tito as its members. Sonra ziyaretçi, UsersRoleList Yineleyici içindeki Yöneticiler ve ana bilgisayar onay kutularını denetleyen UserList DropDownList 'ten Tito seçer.Next, the visitor selects Tito from the UserList DropDownList, which checks the Administrators and Supervisors checkboxes in the UsersRoleList Repeater. Ziyaretçi daha sonra, bir Kullanıcı Yöneticisi rolünü yineleyicisi 'nden denetlediğinde, Tito, süper vizörler rolünden kaldırılır, ancak bu değişiklik "role göre" arabirimine yansıtılmaz.If the visitor then unchecks the Supervisor role from the Repeater, Tito is removed from the Supervisors role, but this modification is not reflected in the "by role" interface. GridView, Gözeviziler rolünün bir üyesi olarak Tito 'ı göstermeye devam eder.The GridView will still show Tito as being a member of the Supervisors role.

Bu hatayı onarmak için, bir rol her eklendiğinde veya UsersRoleList Yineleyici tarafından işaretlenmediğinde GridView 'ı yenilememiz gerekir.To fix this we need to refresh the GridView whenever a role is checked or unchecked from the UsersRoleList Repeater. Benzer şekilde, bir kullanıcı kaldırıldığında veya "role göre" arabiriminden bir role eklendiğinde yineleyicisi yenilememiz gerekir.Likewise, we need to refresh the Repeater whenever a user is removed or added to a role from the "by role" interface.

"Kullanıcıya göre" arabirimindeki Yineleyici, CheckRolesForSelectedUser metodu çağırarak yenilenir.The Repeater in the "by user" interface is refreshed by calling the CheckRolesForSelectedUser method. "Role göre" arabirimi RolesUserList GridView 'un RowDeleting olay işleyicisinde ve AddUserToRoleButton düğmesinin Click olay işleyicisinde değiştirilebilir.The "by role" interface can be modified in the RolesUserList GridView's RowDeleting event handler and the AddUserToRoleButton Button's Click event handler. Bu nedenle, bu yöntemlerin her birinden CheckRolesForSelectedUser yöntemini çağırmanız gerekir.Therefore, we need to call the CheckRolesForSelectedUser method from each of these methods.

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

Benzer şekilde, "role göre" arabirimindeki GridView DisplayUsersBelongingToRole yöntemi çağırarak yenilenir ve "Kullanıcı tarafından" arabirimi RoleCheckBox_CheckChanged olay işleyicisi aracılığıyla değiştirilir.Similarly, the GridView in the "by role" interface is refreshed by calling the DisplayUsersBelongingToRole method and the "by user" interface is modified through the RoleCheckBox_CheckChanged event handler. Bu nedenle, bu olay işleyicisinden DisplayUsersBelongingToRole yöntemini çağırmanız gerekiyor.Therefore, we need to call the DisplayUsersBelongingToRole method from this event handler.

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

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

Bu küçük kod değişiklikleriyle, "kullanıcıya göre" ve "role göre" arabirimleri artık yeniden güncelleştirme için doğru şekilde yapılır.With these minor code changes, the "by user" and "by role" interfaces now correctly cross-update. Bunu doğrulamak için, sayfayı bir tarayıcıda ziyaret edin ve sırasıyla UserList ve RoleList DropDownLists ' i seçin.To verify this, visit the page through a browser and select Tito and Supervisors from the UserList and RoleList DropDownLists, respectively. "Kullanıcı" arabirimindeki yineleyicisi 'nin "Kullanıcı" arabirimindeki yineleyicisi rolünü kaldırdıkça, Tito 'nın "role göre" arabirimindeki GridView 'dan otomatik olarak kaldırılacağını unutmayın.Note that as you uncheck the Supervisors role for Tito from the Repeater in the "by user" interface, Tito is automatically removed from the GridView in the "by role" interface. "Role göre" arabiriminden Supervisors rolüne TITO geri eklemek, "Kullanıcı tarafından" arabirimindeki Gözelebilirlik onay kutusunu otomatik olarak yeniden denetler.Adding Tito back to the Supervisors role from the "by role" interface automatically re-checks the Supervisors checkbox in the "by user" interface.

4. Adım: CreateUserWizard "rol belirt" adımını Içerecek şekilde özelleştirmeStep 4: Customizing the CreateUserWizard to Include a "Specify Roles" Step

Kullanıcı hesapları oluşturma öğreticisinde, CreateUserWizard Web denetiminin yeni bir kullanıcı hesabı oluşturmak için arabirim sağlamak üzere nasıl kullanılacağını gördük.In the Creating User Accounts tutorial we saw how to use the CreateUserWizard Web control to provide an interface for creating a new user account. CreateUserWizard denetimi iki şekilde kullanılabilir:The CreateUserWizard control can be used in one of two ways:

  • Diğer bir deyişle, ziyaretçilerin sitede kendi Kullanıcı hesabını oluşturması veAs a means for visitors to create their own user account on the site, and
  • Yöneticiler yeni hesaplar oluşturmak için bir yol olarakAs a means for administrators to create new accounts

İlk kullanım durumunda ziyaretçi siteye gönderilir ve CreateUserWizard, bu bilgileri siteye kaydolmak için bilgilerini girerek doldurur.In the first use case, a visitor comes to the site and fills out the CreateUserWizard, entering their information in order to register on the site. İkinci durumda, yönetici başka bir kişi için yeni bir hesap oluşturur.In the second case, an administrator creates a new account for another person.

Bir hesap bir yönetici tarafından başka bir kişi için oluşturulduğunda, yöneticinin yeni kullanıcı hesabının ait olduğu rolleri belirtmesini sağlamak yararlı olabilir.When an account is being created by an administrator for some other person, it might be helpful to allow the administrator to specify what roles the new user account belongs to. Ek kullanıcı bilgilerini depolama öğreticisinde, ek WizardStepsekleyerek CreateUserWizard özelleştirmeyi nasıl özelleştireceğinizi gördük.In the Storing Additional User Information tutorial we saw how to customize the CreateUserWizard by adding additional WizardSteps. Yeni kullanıcının rollerini belirtmek için CreateUserWizard 'e ek bir adım ekleme bölümüne bakalım.Let's look at how to add an additional step to the CreateUserWizard in order to specify the new user's roles.

CreateUserWizardWithRoles.aspx sayfasını açın ve RegisterUserWithRolesadlı bir CreateUserWizard denetimi ekleyin.Open the CreateUserWizardWithRoles.aspx page and add a CreateUserWizard control named RegisterUserWithRoles. Denetimin ContinueDestinationPageUrl özelliğini "~/default.aspx" olarak ayarlayın.Set the control's ContinueDestinationPageUrl property to "~/Default.aspx". Buradaki fikir bir yöneticinin yeni kullanıcı hesapları oluşturmak için bu CreateUserWizard denetimini kullanacağı için, denetimin LoginCreatedUser özelliğini false olarak ayarlayın.Because the idea here is that an administrator will be using this CreateUserWizard control to create new user accounts, set the control's LoginCreatedUser property to False. Bu LoginCreatedUser özelliği, ziyaretçinin otomatik olarak yeni oluşturulan kullanıcı olarak oturum açıp açmamadığını belirtir ve varsayılan olarak true değerini alır.This LoginCreatedUser property specifies whether the visitor is automatically logged on as the just-created user, and it defaults to True. Bir yönetici, hımself olarak oturum açdığımız yeni bir hesap oluşturduğunda, bu değeri false olarak ayarlayacağız.We set it to False because when an administrator creates a new account we want to keep him signed in as himself.

Sonra, "Ekle/Kaldır WizardSteps..." öğesini seçin. CreateUserWizard 'in akıllı etiketinden ve yeni bir WizardStepekleyerek ID SpecifyRolesStepolarak ayarlayarak.Next, select the "Add/Remove WizardSteps…" option from the CreateUserWizard's Smart Tag and add a new WizardStep, setting its ID to SpecifyRolesStep. SpecifyRolesStep WizardStep, "yeni hesabınız için kaydolun" adımından sonra gelen, ancak "Tamam" adımından önce gelecek şekilde taşıyın.Move the SpecifyRolesStep WizardStep so that it comes after the "Sign Up for Your New Account" step, but before the "Complete" step. WizardStep``Title özelliğini "rolleri belirtin", StepType özelliğini Stepve AllowReturn özelliğini false olarak ayarlayın.Set the WizardStep's Title property to "Specify Roles", its StepType property to Step, and its AllowReturn property to False.

ekleyinAdd the

Şekil 11: "rolleri belirt" WizardStep CreateUserWizard ekleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 11: Add the "Specify Roles" WizardStep to the CreateUserWizard (Click to view full-size image)

Bu değişiklikten sonra, CreateUserWizard 'in bildirim temelli biçimlendirmesinin aşağıdaki gibi görünmesi gerekir:After this change your CreateUserWizard's declarative markup should look like the following:

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

"Rolleri belirtin" WizardStep, RoleListadlı bir CheckBoxList ekleyin.In the "Specify Roles" WizardStep, add a CheckBoxList named RoleList. Bu CheckBoxList, kullanılabilir rolleri listeler ve yeni oluşturulan kullanıcının hangi rollere ait olduğunu denetlemek için sayfayı ziyaret eden kişiyi kontrol eder.This CheckBoxList will list the available roles, enabling the person visiting the page to check what roles the newly created user belongs to.

İki kodlama görevini doldurduk: ilk olarak RoleList CheckBoxList öğesini sistemdeki rollerle doldurmamız gerekir; İkinci olarak, Kullanıcı "rolleri belirt" adımından "Tamam" adımına geçerse oluşturulan kullanıcıyı seçili rollere eklememiz gerekiyor.We are left with two coding tasks: first we must populate the RoleList CheckBoxList with the roles in the system; second, we need to add the created user to the selected roles when the user moves from the "Specify Roles" step to the "Complete" step. Page_Load olay işleyicisindeki ilk görevi gerçekleştirebiliriz.We can accomplish the first task in the Page_Load event handler. Aşağıdaki kod programlı olarak sayfaya ilk ziyaretteki RoleList onay kutusuna başvurur ve sistemdeki rolleri buna bağlar.The following code programmatically references the RoleList CheckBox on the first visit to the page and binds the roles in the system to it.

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

Yukarıdaki kod tanıdık gelmelidir.The above code should look familiar. Ek kullanıcı bilgilerini depolayan öğreticide, özel bir WizardStepiçinden bir Web denetimine başvurmak için iki FindControl deyimi kullandık.In the Storing Additional User Information tutorial we used two FindControl statements to reference a Web control from within a custom WizardStep. Ve bu öğreticide, rolleri CheckBoxList 'e bağlayan kod alınmıştır.And the code that binds the roles to the CheckBoxList was taken from earlier in this tutorial.

İkinci programlama görevini gerçekleştirmek için "rol belirt" adımının tamamlandığını bilmemiz gerekiyor.In order to perform the second programming task we need to know when the "Specify Roles" step has been completed. CreateUserWizard bir ActiveStepChanged olayına sahip olduğunu anımsayın, bu, ziyaretçi bir adımdan diğerine her gittiğinde ateşlenir.Recall that the CreateUserWizard has an ActiveStepChanged event, which fires each time the visitor navigates from one step to another. Burada, kullanıcının "tamamlandı" adımına ulaşılmadığını tespit ettik. Bu durumda, kullanıcıyı seçili rollere eklememiz gerekiyor.Here we can determine if the user has reached the "Complete" step; if so, we need to add the user to the selected roles.

ActiveStepChanged olayı için bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:Create an event handler for the ActiveStepChanged event and add the following code:

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

Kullanıcı "tamamlandı" adımına ulaştıysa, olay işleyicisi RoleList CheckBoxList öğelerini numaralandırır ve yalnızca oluşturulan Kullanıcı seçili rollere atanır.If the user has just reached the "Completed" step, the event handler enumerates the items of the RoleList CheckBoxList and the just-created user is assigned to the selected roles.

Bu sayfayı bir tarayıcı aracılığıyla ziyaret edin.Visit this page through a browser. CreateUserWizard ilk adımı, yeni kullanıcının Kullanıcı adı, parola, e-posta ve diğer anahtar bilgilerini isteyen standart "yeni hesabınızda kaydolma" adımsıdır.The first step in the CreateUserWizard is the standard "Sign Up for Your New Account" step, which prompts for the new user's username, password, email, and other key information. Wda adlı yeni bir kullanıcı oluşturmak için bilgileri girin.Enter the information to create a new user named Wanda.

Wda adlı yeni bir kullanıcı oluşturmak Create a New User Named Wanda

Şekil 12: wda adlı yeni bir kullanıcı oluşturun (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 12: Create a New User Named Wanda (Click to view full-size image)

"Kullanıcı Oluştur" düğmesine tıklayın.Click the "Create User" button. CreateUserWizard dahili olarak Membership.CreateUser yöntemini çağırır, Yeni Kullanıcı hesabını oluşturur ve sonraki adıma geçerek "rolleri belirt" i ilerler.The CreateUserWizard internally calls the Membership.CreateUser method, creating the new user account, and then progresses to the next step, "Specify Roles." Burada sistem rolleri listelenir.Here the system roles are listed. Supervizler onay kutusunu işaretleyin ve Ileri ' ye tıklayın.Check the Supervisors checkbox and click Next.

, süper vizörlerin rolünün bir üyesini yapınMake Wanda a Member of the Supervisors Role

Şekil 13: wda ' ı süper vizörler rolünün bir üyesi yapın (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 13: Make Wanda a Member of the Supervisors Role (Click to view full-size image)

Ileri ' ye tıklamak geri göndermeye neden olur ve ActiveStep "Tamam" adımını güncelleştirir.Clicking Next causes a postback and updates the ActiveStep to the "Complete" step. ActiveStepChanged olay işleyicisinde, son oluşturulan kullanıcı hesabı, süper vizörler rolüne atanır.In the ActiveStepChanged event handler, the recently-created user account is assigned to the Supervisors role. Bunu doğrulamak için UsersAndRoles.aspx sayfasına dönün ve RoleList DropDownList 'ten süper vizörleri seçin.To verify this, return to the UsersAndRoles.aspx page and select Supervisors from the RoleList DropDownList. Şekil 14 ' te gösterildiği gibi, üst yöneticiler artık üç kullanıcıdan oluşur: deneme sürümü, Tito ve wda.As Figure 14 shows, the Supervisors are now made up of three users: Bruce, Tito, and Wanda.

Bruce, Tito ve wda tüm süper bilgisayarlarBruce, Tito, and Wanda are All Supervisors

Şekil 14: deneme tarafı, Tito ve wda tüm süper vizörler (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 14: Bruce, Tito, and Wanda are All Supervisors (Click to view full-size image)

ÖzetSummary

Rol çerçevesi, belirli bir role hangi kullanıcıların ait olduğunu belirlemek için belirli bir kullanıcının rolleri ve yöntemleri hakkındaki bilgileri almak için yöntemler sunar.The Roles framework offers methods for retrieving information about a particular user's roles and methods for determining what users belong to a specified role. Ayrıca, bir veya daha fazla kullanıcı için bir veya daha fazla rol eklemek ve kaldırmak için çeşitli yöntemler vardır.Furthermore, there are a number of methods for adding and removing one or more users to one or more roles. Bu öğreticide şu yöntemlerin yalnızca iki birine odaklanıyoruz: AddUserToRole ve RemoveUserFromRole.In this tutorial we focused on just two of these methods: AddUserToRole and RemoveUserFromRole. Tek bir role birden çok kullanıcı eklemek ve tek bir kullanıcıya birden çok rol atamak için tasarlanan ek çeşitler vardır.There are additional variants designed to add multiple users to a single role and to assign multiple roles to a single user.

Bu öğretici Ayrıca, yeni oluşturulan kullanıcının rollerini belirtmek için bir WizardStep dahil etmek üzere CreateUserWizard denetimini genişletmeye bir görünüm de eklenmiştir.This tutorial also included a look at extending the CreateUserWizard control to include a WizardStep to specify the newly-created user's roles. Böyle bir adım, bir yöneticinin yeni kullanıcılar için Kullanıcı hesapları oluşturma sürecini kolaylaştırmaya yardımcı olabilir.Such a step could help an administrator streamline the process of creating user accounts for new users.

Bu noktada, rolleri oluşturma ve silme ve rollerden Kullanıcı ekleme ve kaldırma işlemlerinin nasıl yapıldığını gördünüz.At this point we have seen how to create and delete roles and how to add and remove users from roles. Ancak rol tabanlı yetkilendirme uygulamak için henüz bakacağız.But we have yet to look at applying role-based authorization. Aşağıdaki öğreticide , rol rol temelinde URL Yetkilendirme kuralları tanımlamayı ve şu anda oturum açmış olan kullanıcının rollerine göre sayfa düzeyi işlevselliğinin nasıl sınırlandıralınacağını inceleyeceğiz.In the following tutorial we will look at defining URL authorization rules on a role-by-role basis, as well as how to limit page-level functionality based on the currently logged in user's roles.

Programlamanın kutlu olsun!Happy Programming!

Daha Fazla BilgiFurther Reading

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:For more information on the topics discussed in this tutorial, refer to the following resources:

Yazar hakkındaAbout the Author

Birden çok ASP/ASP. NET Books ve 4GuysFromRolla.com 'in yazarı Scott Mitchell, 1998 sürümünden bu yana Microsoft Web teknolojileriyle birlikte çalışıyor.Scott Mitchell, author of multiple ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor.Scott works as an independent consultant, trainer, and writer. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitim ister.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Scott 'a mitchell@4guysfromrolla.com veya blogundan http://ScottOnWriting.NETüzerinden erişilebilir.Scott can be reached at mitchell@4guysfromrolla.com or via his blog at http://ScottOnWriting.NET.

Özel olarak teşekkürler...Special Thanks To…

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi.This tutorial series was reviewed by many helpful reviewers. Bu öğretici için müşteri adayı gözden geçireni bir Murphy idi.Lead reviewer for this tutorial was Teresa Murphy. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz?Interested in reviewing my upcoming MSDN articles? Öyleyse, beni mitchell@4GuysFromRolla.com bir satır bırakınIf so, drop me a line at mitchell@4GuysFromRolla.com