Tworzenie ról i zarządzanie nimi (VB)

Autor: Scott Mitchell

Uwaga

Ponieważ ten artykuł został napisany, dostawcy ASP.NET członkostwa zostały zastąpione przez usługę ASP.NET Identity. Zdecydowanie zalecamy aktualizowanie aplikacji w celu korzystania z platformy ASP.NET Identity , a nie dostawców członkostwa opisanych w tym artykule. ASP.NET Identity ma wiele zalet w systemie członkostwa ASP.NET, w tym :

  • Lepsza wydajność
  • Ulepszona rozszerzalność i możliwość testowania
  • Obsługa uwierzytelniania OAuth, OpenID Connect i uwierzytelniania dwuskładnikowego
  • Obsługa tożsamości opartej na oświadczeniach
  • Lepsza współdziałanie z platformą ASP.Net Core

Pobierz kod lub pobierz plik PDF

W tym samouczku przedstawiono kroki niezbędne do skonfigurowania struktury Role. Następnie utworzymy strony internetowe w celu utworzenia i usunięcia ról.

Wprowadzenie

W samouczku autoryzacji opartej na użytkowniku przyjrzeliśmy się używaniu autoryzacji adresu URL w celu ograniczenia niektórych użytkowników z zestawu stron oraz eksplorowanych deklaratywnych i programowych technik dostosowywania funkcjonalności strony ASP.NET na podstawie użytkownika odwiedzającego. Udzielanie uprawnień dostępu do strony lub funkcjonalności na podstawie użytkownika może jednak stać się koszmarem konserwacji w scenariuszach, w których często zmienia się wiele kont użytkowników lub gdy uprawnienia użytkowników się zmieniają. Za każdym razem, gdy użytkownik zyskuje lub traci autoryzację do wykonania określonego zadania, administrator musi zaktualizować odpowiednie reguły autoryzacji adresu URL, deklaratywne znaczniki i kod.

Zwykle pomaga sklasyfikować użytkowników w grupach lub rolach , a następnie zastosować uprawnienia w oparciu o rolę. Na przykład większość aplikacji internetowych ma określony zestaw stron lub zadań zarezerwowanych tylko dla użytkowników administracyjnych. Korzystając z technik poznanych w samouczku autoryzacji opartej na użytkowniku , dodamy odpowiednie reguły autoryzacji adresów URL, deklaratywne znaczniki i kod, aby umożliwić określonym kontom użytkowników wykonywanie zadań administracyjnych. Jeśli jednak nowy administrator został dodany lub jeśli istniejący administrator musi mieć odwołane prawa administracyjne, musimy zwrócić i zaktualizować pliki konfiguracji i strony internetowe. W przypadku ról można jednak utworzyć rolę o nazwie Administratorzy i przypisać tych zaufanych użytkowników do roli Administratorzy. Następnie dodamy odpowiednie reguły autoryzacji adresu URL, znaczniki deklaratywne i kod, aby umożliwić roli Administratorzy wykonywanie różnych zadań administracyjnych. Dzięki tej infrastrukturze dodawanie nowych administratorów do witryny lub usuwanie istniejących jest tak proste, jak dołączanie lub usuwanie użytkownika z roli Administratorzy. Nie są konieczne żadne zmiany konfiguracji, znaczników deklaratywnego ani kodu.

ASP.NET oferuje strukturę ról do definiowania ról i kojarzenia ich z kontami użytkowników. Za pomocą struktury Role możemy tworzyć i usuwać role, dodawać użytkowników do roli lub usuwać ich z roli, określać zestaw użytkowników należących do określonej roli i określać, czy użytkownik należy do określonej roli. Po skonfigurowaniu struktury Role możemy ograniczyć dostęp do stron na podstawie ról za pomocą reguł autoryzacji adresów URL i wyświetlać lub ukrywać dodatkowe informacje lub funkcje na stronie na podstawie aktualnie zalogowanych ról użytkownika.

W tym samouczku przedstawiono kroki niezbędne do skonfigurowania struktury Role. Następnie utworzymy strony internetowe w celu utworzenia i usunięcia ról. W samouczku Przypisywanie ról do użytkowników przyjrzymy się sposobom dodawania i usuwania użytkowników z ról. W samouczku autoryzacji opartej na rolach zobaczymy, jak ograniczyć dostęp do stron na podstawie ról oraz jak dostosować funkcjonalność strony w zależności od roli odwiedzającego użytkownika. Zaczynamy!

Krok 1. Dodawanie nowych stron ASP.NET

W tym samouczku i w kolejnych dwóch będziemy badać różne funkcje i możliwości związane z rolami. Będziemy potrzebować serii stron ASP.NET, aby zaimplementować tematy omówione w tych samouczkach. Utwórzmy te strony i zaktualizujmy mapę witryny.

Rozpocznij od utworzenia nowego folderu w projekcie o nazwie Roles. Następnie dodaj cztery nowe strony ASP.NET do Roles folderu, łącząc każdą stronę ze stroną wzorcową Site.master . Nazwij strony:

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

W tym momencie Eksplorator rozwiązań projektu powinny wyglądać podobnie do zrzutu ekranu pokazanego na rysunku 1.

Do folderu Role zostały dodane cztery nowe strony

Rysunek 1. Do folderu zostały dodane Roles cztery nowe strony (kliknij, aby wyświetlić obraz pełnowymiarowy)

Każda strona powinna mieć w tym momencie dwie kontrolki Zawartość, jedną dla każdej z symboli ContentPlaceHolders strony wzorcowej: MainContent i LoginContent.

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

Pamiętaj, że LoginContent domyślny znacznik ContentPlaceHolder wyświetla link do logowania lub wylogowania się z witryny, w zależności od tego, czy użytkownik jest uwierzytelniony. Content2 Obecność kontrolki Zawartość na stronie ASP.NET zastępuje jednak domyślny znacznik strony wzorcowej. Jak omówiono w samouczku Omówienie uwierzytelniania formularzy , zastępowanie domyślnego znaczników jest przydatne na stronach, na których nie chcemy wyświetlać opcji związanych z logowaniem w lewej kolumnie.

W przypadku tych czterech stron chcemy jednak wyświetlić domyślne znaczniki strony wzorcowej dla LoginContent elementu ContentPlaceHolder. W związku z tym usuń deklaratywne znaczniki dla kontrolki Content2 Zawartość. Po wykonaniu tej czynności każdy z czterech znaczników strony powinien zawierać tylko jedną kontrolkę Zawartość.

Na koniec zaktualizujmy mapę witryny (Web.sitemap), aby uwzględnić te nowe strony internetowe. Dodaj następujący kod XML po <siteMapNode> dodaniu do samouczków dotyczących członkostwa.

<siteMapNode title="Roles"> 
 <siteMapNode url="~/Roles/ManageRoles.aspx" title="Manage Roles" />
 <siteMapNode url="~/Roles/UsersAndRoles.aspx" title="Users and Roles" />
 <siteMapNode url="~/Roles/CreateUserWizardWithRoles.aspx" title="Create Account (with Roles)"/>
 <siteMapNode url="~/Roles/RoleBasedAuthorization.aspx" title="Role-Based Authorization" />
</siteMapNode>

Po zaktualizowaniu mapy witryny odwiedź witrynę za pośrednictwem przeglądarki. Jak pokazano na rysunku 2, nawigacja po lewej stronie zawiera teraz elementy samouczków role.

Nawigacja po lewej stronie zawiera teraz elementy samouczków ról.

Rysunek 2. Do folderu zostały dodane Roles cztery nowe strony (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 2. Określanie i konfigurowanie dostawcy struktury ról

Podobnie jak struktura członkostwa, platforma Role jest tworzona na szczycie modelu dostawcy. Jak opisano w samouczku Podstawy zabezpieczeń i ASP.NET Support, .NET Framework dostarczane z trzema wbudowanymi dostawcami ról: AuthorizationStoreRoleProvider, WindowsTokenRoleProvideri SqlRoleProvider. Ta seria samouczków koncentruje się na SqlRoleProviderprogramie , który używa bazy danych microsoft SQL Server jako magazynu ról.

Poniżej omówiono strukturę Role i SqlRoleProvider działają tak samo jak struktura członkostwa i SqlMembershipProvider. .NET Framework zawiera klasęRoles, która służy jako interfejs API do platformy Role. Klasa Roles ma metody udostępnione, takie jak CreateRole, , AddUserToRoleDeleteRoleGetAllRoles, , IsUserInRolei tak dalej. Po wywołaniu Roles jednej z tych metod klasa deleguje wywołanie do skonfigurowanego dostawcy. Działa SqlRoleProvider z tabelami specyficznymi dla ról (aspnet_Roles i aspnet_UsersInRoles) w odpowiedzi.

Aby używać dostawcy SqlRoleProvider w naszej aplikacji, musimy określić bazę danych, która ma być używana jako magazyn. Oczekuje SqlRoleProvider się, że określony magazyn ról będzie miał pewne tabele, widoki i procedury składowane bazy danych. Te wymagane obiekty bazy danych można dodać za pomocą aspnet_regsql.exe narzędzia. W tym momencie mamy już bazę danych ze schematem wymaganym dla elementu SqlRoleProvider. Po powrocie do samouczka Tworzenie schematu członkostwa w SQL Server utworzyliśmy bazę danych o nazwie SecurityTutorials.mdf i użyto aspnet_regsql.exe jej do dodania usług aplikacji, które obejmowały obiekty bazy danych wymagane przez SqlRoleProviderprogram . Dlatego musimy po prostu poinformować platformę Role, aby włączyć obsługę ról i używać SqlRoleProvider jej z bazą SecurityTutorials.mdf danych jako magazynem ról.

Struktura Role jest konfigurowana za pośrednictwem <roleManager> elementu w pliku aplikacji Web.config . Domyślnie obsługa ról jest wyłączona. Aby ją włączyć, należy ustawić <roleManager> atrybut elementu enabled na true następujący:

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

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

Domyślnie wszystkie aplikacje internetowe mają dostawcę ról o nazwie AspNetSqlRoleProvider .SqlRoleProvider Ten domyślny dostawca jest zarejestrowany w machine.config lokalizacji (znajdującej się w lokalizacji %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG):

<roleManager>
 <providers>
 <add name="AspNetSqlRoleProvider"
 connectionStringName="LocalSqlServer"
 applicationName="/"
 type="System.Web.Security.SqlRoleProvider,
 System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
 </providers>
</roleManager>

Atrybut dostawcy connectionStringName określa używany magazyn ról. AspNetSqlRoleProvider Dostawca ustawia ten atrybut na LocalSqlServer, który jest również zdefiniowany w machine.config obiekcie i domyślnie wskazuje na bazę danych SQL Server 2005 Express Edition w App_Data folderze o nazwie aspnet.mdf.

W związku z tym, jeśli po prostu włączymy strukturę Role bez określenia żadnych informacji o dostawcy w pliku naszej aplikacjiWeb.config, aplikacja używa domyślnego zarejestrowanego dostawcy ról. AspNetSqlRoleProvider ~/App_Data/aspnet.mdf Jeśli baza danych nie istnieje, środowisko uruchomieniowe ASP.NET automatycznie go utworzy i doda schemat usług aplikacji. Nie chcemy jednak używać bazy danych. Chcemy jednak użyć już utworzonej aspnet.mdfSecurityTutorials.mdf bazy danych i dodania do niego schematu usług aplikacji. Tę modyfikację można wykonać na jeden z dwóch sposobów:

Dodaj następujący znacznik konfiguracji ról do Web.config pliku. Ten znacznik rejestruje nowego dostawcę o nazwie SecurityTutorialsSqlRoleProvider.

<?xml version="1.0"?>
<configuration>
 <connectionStrings>
 <add name="SecurityTutorialsConnectionString"
 connectionString="..."/>
 </connectionStrings>

 <system.web>
 ... Additional configuration markup removed for brevity ...

 &nbsp &nbsp<roleManager enabled="true" defaultProvider="SecurityTutorialsSqlRoleProvider">
 &nbsp &nbsp &nbsp<providers>
 <add name="SecurityTutorialsSqlRoleProvider"
 type="System.Web.Security.SqlRoleProvider"
 applicationName="SecurityTutorials"
 connectionStringName="SecurityTutorialsConnectionString"/>
 </providers>
 </roleManager>
 <system.web>
</configuration>

Powyższy znacznik definiuje SecurityTutorialsSqlRoleProvider jako dostawcę domyślnego (za pośrednictwem atrybutu defaultProvider<roleManager> w elemecie). Ustawia SecurityTutorialsSqlRoleProviderapplicationName również ustawienie SecurityTutorialsna , które jest tym samym applicationName ustawieniem używanym przez dostawcę członkostwa (SecurityTutorialsSqlMembershipProvider). Chociaż nie pokazano tutaj, <add> element dla SqlRoleProvider elementu może również zawierać commandTimeout atrybut określający czas trwania limitu czasu bazy danych w sekundach. Wartość domyślna to 30.

Dzięki temu znacznikowi konfiguracji możemy rozpocząć korzystanie z funkcji roli w naszej aplikacji.

Uwaga

Powyższy znacznik konfiguracji ilustruje użycie <roleManager> atrybutów i defaultProvider elementuenabled. Istnieje wiele innych atrybutów, które wpływają na sposób, w jaki platforma Role kojarzy informacje o rolach na podstawie użytkownika. Przeanalizujemy te ustawienia w samouczku autoryzacji opartej na rolach.

Krok 3. Badanie interfejsu API ról

Funkcjonalność platformy Role jest uwidoczniona za pośrednictwem Roles klasy, która zawiera trzynaście udostępnionych metod wykonywania operacji opartych na rolach. Podczas tworzenia i usuwania ról w krokach 4 i 6 użyjemy CreateRole metod i DeleteRole , które dodają lub usuńą rolę z systemu.

Aby uzyskać listę wszystkich ról w systemie, użyj GetAllRoles metody (zobacz Krok 5). MetodaRoleExists zwraca wartość logiczną wskazującą, czy istnieje określona rola.

W następnym samouczku sprawdzimy, jak skojarzyć użytkowników z rolami. AddUserToRoleMetody Roles klasy , AddUserToRoles, AddUsersToRolei AddUsersToRoles dodają co najmniej jednego użytkownika do co najmniej jednej roli. Aby usunąć użytkowników z ról, użyj RemoveUserFromRolemetod , RemoveUserFromRoles, RemoveUsersFromRolelub RemoveUsersFromRoles .

W samouczku autoryzacji opartej na rolach przyjrzymy się sposobom programowego wyświetlania lub ukrywania funkcji na podstawie aktualnie zalogowanej roli użytkownika. W tym celu możemy użyć metod FindUsersInRoleklasy Role , GetRolesForUser, GetUsersInRolelub IsUserInRole .

Uwaga

Należy pamiętać, że za każdym razem, gdy jest wywoływana jedna z tych metod, Roles klasa deleguje wywołanie do skonfigurowanego dostawcy. W naszym przypadku oznacza to, że wywołanie jest wysyłane do elementu SqlRoleProvider. Następnie SqlRoleProvider wykonuje odpowiednią operację bazy danych na podstawie wywoływanej metody. Na przykład kod Roles.CreateRole("Administrators") powoduje SqlRoleProvider wykonanie aspnet_Roles_CreateRole procedury składowanej, która wstawia nowy rekord do aspnet_Roles tabeli o nazwie Administratorzy .

W pozostałej części tego samouczka przedstawiono użycie Roles klas CreateRole, GetAllRolesi DeleteRole metod do zarządzania rolami w systemie.

Krok 4. Tworzenie nowych ról

Role oferują sposób arbitralnego grupowania użytkowników, a najczęściej to grupowanie jest używane do bardziej wygodnego sposobu stosowania reguł autoryzacji. Aby jednak używać ról jako mechanizmu autoryzacji, najpierw musimy zdefiniować, jakie role istnieją w aplikacji. Niestety, ASP.NET nie zawiera kontrolki CreateRoleWizard. Aby dodać nowe role, musimy utworzyć odpowiedni interfejs użytkownika i wywołać interfejs API ról. Dobrą wiadomością jest to, że jest to bardzo łatwe do osiągnięcia.

Uwaga

Chociaż nie ma kontrolki Sieci Web CreateRoleWizard, istnieje narzędzie ASP.NET administracja witrynami sieci Web, które jest lokalną aplikacją ASP.NET zaprojektowaną w celu ułatwienia wyświetlania konfiguracji aplikacji internetowej i zarządzania nią. Jednak nie jestem wielkim fanem ASP.NET Web Site Administration Tool z dwóch powodów. Po pierwsze, jest to nieco usterka, a środowisko użytkownika pozostawia wiele do życzenia. Po drugie narzędzie ASP.NET administracja witryną sieci Web jest przeznaczone tylko do pracy lokalnie, co oznacza, że konieczne będzie utworzenie własnych stron sieci Web zarządzania rolami, jeśli musisz zdalnie zarządzać rolami w witrynie na żywo. Z tych dwóch powodów ten samouczek i następny skoncentrują się na tworzeniu niezbędnych narzędzi do zarządzania rolami na stronie internetowej zamiast polegać na narzędziu ASP.NET Administracji witrynami sieci Web.

ManageRoles.aspx Otwórz stronę w folderze Roles i dodaj kontrolkę TextBox i kontrolkę Sieci Web przycisku do strony. Ustaw właściwość kontrolki ID TextBox odpowiednio RoleName na i właściwości przycisku IDText na CreateRoleButton i Utwórz rolę. Na tym etapie deklaratywne znaczniki strony powinny wyglądać podobnie do następujących:

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

Następnie kliknij dwukrotnie kontrolkę CreateRoleButton Przycisk w Projektant, aby utworzyć procedurę Click obsługi zdarzeń, a następnie dodaj następujący kod:

Protected Sub CreateRoleButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateRoleButton.Click
 Dim newRoleName As String = RoleName.Text.Trim()

 If Not Roles.RoleExists(newRoleName) Then
 ' Create the role
 Roles.CreateRole(newRoleName)
 End If

 RoleName.Text= String.Empty 
End Sub

Powyższy kod rozpoczyna się od przypisania przyciętej nazwy roli wprowadzonej RoleName w polu TextBox do zmiennej newRoleName . Następnie metoda klasy jest wywoływana RoleExists w celu określenia, Roles czy rola newRoleName już istnieje w systemie. Jeśli rola nie istnieje, jest tworzona za pośrednictwem wywołania CreateRole metody . CreateRole Jeśli metoda jest przekazywana jako nazwa roli, która już istnieje w systemie, ProviderException zgłaszany jest wyjątek. Dlatego kod najpierw sprawdza, czy rola nie istnieje jeszcze w systemie przed wywołaniem metody CreateRole. Procedura Click obsługi zdarzeń kończy się wyczyszczeniem RoleName właściwości TextBox Text .

Uwaga

Być może zastanawiasz się, co się stanie, jeśli użytkownik nie wprowadzi żadnej wartości w polu tekstowym RoleName . Jeśli wartość przekazana do CreateRole metody to Nothing lub pusty ciąg, zostanie zgłoszony wyjątek. Podobnie, jeśli nazwa roli zawiera przecinek, zgłaszany jest wyjątek. W związku z tym strona powinna zawierać kontrolki sprawdzania poprawności, aby upewnić się, że użytkownik wprowadzi rolę i że nie zawiera żadnych przecinków. Zostawię jako ćwiczenie dla czytelnika.

Utwórzmy rolę o nazwie Administratorzy. ManageRoles.aspx Odwiedź stronę za pośrednictwem przeglądarki, wpisz w polu tekstowym Administratorzy (zobacz Rysunek 3), a następnie kliknij przycisk Utwórz rolę.

Tworzenie roli administratorów

Rysunek 3. Tworzenie roli administratorów (kliknij, aby wyświetlić obraz pełnowymiarowy)

Co się dzieje? Następuje powrót, ale nie ma wizualnego sygnału, że rola została rzeczywiście dodana do systemu. Zaktualizujemy tę stronę w kroku 5, aby uwzględnić opinie wizualne. Na razie można jednak sprawdzić, czy rola została utworzona, przechodząc do SecurityTutorials.mdf bazy danych i wyświetlając dane z aspnet_Roles tabeli. Jak pokazano na rysunku aspnet_Roles 4, tabela zawiera rekord dla ról administratorów dodanych właśnie.

Tabela aspnet_Roles ma wiersz dla administratorów

Rysunek 4. Tabela aspnet_Roles ma wiersz dla administratorów (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 5. Wyświetlanie ról w systemie

Rozszerzmy stronę, ManageRoles.aspx aby uwzględnić listę bieżących ról w systemie. Aby to osiągnąć, dodaj kontrolkę GridView do strony i ustaw jej ID właściwość na RoleList. Następnie dodaj metodę do klasy kodu za stroną o nazwie DisplayRolesInGrid przy użyciu następującego kodu:

Private Sub DisplayRolesInGrid()
 RoleList.DataSource = Roles.GetAllRoles()
 RoleList.DataBind()
End Sub

Metoda Roles klasy GetAllRoles zwraca wszystkie role w systemie jako tablicę ciągów. Ta tablica ciągów jest następnie powiązana z elementem GridView. Aby powiązać listę ról z kontrolką GridView po pierwszym załadowaniu strony, musimy wywołać DisplayRolesInGrid metodę z programu obsługi zdarzeń strony Page_Load . Poniższy kod wywołuje tę metodę, gdy strona zostanie po raz pierwszy odwiedzona, ale nie na kolejnych zwrotach.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 If Not Page.IsPostBack Then
 DisplayRolesInGrid()
 End If 
End Sub

Korzystając z tego kodu, odwiedź stronę za pośrednictwem przeglądarki. Jak pokazano na rysunku 5, powinna zostać wyświetlona siatka z pojedynczą kolumną z etykietą Element. Siatka zawiera wiersz roli Administratorzy, który dodaliśmy w kroku 4.

Kontrolka GridView wyświetla role w jednej kolumnie

Rysunek 5. Widok GridView wyświetla role w pojedynczej kolumnie (kliknij, aby wyświetlić obraz pełnowymiarowy)

W elemencie GridView jest wyświetlana kolumna samotna z etykietą Item, ponieważ właściwość GridView jest ustawiona na wartość True (wartość domyślna), co powoduje, że kontrolka GridView AutoGenerateColumns automatycznie utworzy kolumnę dla każdej właściwości w elemencie DataSource. Tablica ma jedną właściwość, która reprezentuje elementy w tablicy, stąd pojedyncza kolumna w siatce.

Podczas wyświetlania danych za pomocą kontrolki GridView preferuję jawne definiowanie kolumn, a nie ich niejawnie generowanych przez element GridView. Jawnie definiując kolumny, znacznie łatwiej jest sformatować dane, zmienić rozmieszczenie kolumn i wykonać inne typowe zadania. W związku z tym zaktualizujmy deklaratywny znacznik GridView, tak aby jego kolumny zostały jawnie zdefiniowane.

Zacznij od ustawienia właściwości GridView AutoGenerateColumns na wartość False. Następnie dodaj pole TemplateField do siatki, ustaw jej HeaderText właściwość na Role i skonfiguruj ją ItemTemplate tak, aby wyświetlała zawartość tablicy. Aby to zrobić, dodaj kontrolkę Sieć Web Etykieta o nazwie RoleNameLabel do ItemTemplate właściwości i powiąż jej Text właściwość z Container.DataItem.

Te właściwości i ItemTemplatezawartość można ustawić deklaratywnie lub za pomocą okna dialogowego Pola kontrolki GridView i interfejsu Edytuj szablony. Aby uzyskać dostęp do okna dialogowego Pola, kliknij link Edytuj kolumny w tagu inteligentnym GridView. Następnie usuń zaznaczenie pola wyboru Automatycznie generuj pola, aby ustawić AutoGenerateColumns właściwość na Wartość Fałsz, a następnie dodaj pole TemplateField do kontrolki GridView, ustawiając jej HeaderText właściwość na Role. Aby zdefiniować ItemTemplatezawartość elementu , wybierz opcję Edytuj szablony z tagu inteligentnego GridView. Przeciągnij kontrolkę Etykieta sieci Web na ItemTemplatewłaściwość , ustaw jej ID właściwość na RoleNameLabel, a następnie skonfiguruj ustawienia powiązania danych, tak aby jej Text właściwość została powiązana z wartością Container.DataItem.

Niezależnie od używanego podejścia wynikowy znacznik deklaratywnego elementu GridView powinien wyglądać podobnie do poniższego po zakończeniu.

<asp:GridView ID="RoleList" runat="server" AutoGenerateColumns="false">
 <Columns>
 <asp:TemplateField HeaderText="Role">
 <ItemTemplate>
 <asp:Label runat="server" ID="RoleNameLabel" Text='<%# Container.DataItem %>' />
 </ItemTemplate>
 </asp:TemplateField>
 </Columns>
</asp:GridView>

Uwaga

Zawartość tablicy jest wyświetlana przy użyciu składni <%# Container.DataItem %>powiązania danych . Dokładny opis tego, dlaczego ta składnia jest używana podczas wyświetlania zawartości tablicy powiązanej z elementem GridView, wykracza poza zakres tego samouczka. Aby uzyskać więcej informacji na ten temat, zobacz Powiązanie tablicy skalarnej z kontrolką sieci Web danych.

Obecnie element RoleList GridView jest powiązany tylko z listą ról, gdy strona zostanie po raz pierwszy odwiedzona. Musimy odświeżyć siatkę za każdym razem, gdy zostanie dodana nowa rola. Aby to osiągnąć, zaktualizuj CreateRoleButton procedurę obsługi zdarzeń przycisku Click , aby wywołać metodę DisplayRolesInGrid , jeśli zostanie utworzona nowa rola.

Protected Sub CreateRoleButton_Click(ByVal sender As Object,ByVal e As System.EventArgs) Handles CreateRoleButton.Click
 Dim newRoleName As String = RoleName.Text.Trim()

 If Not Roles.RoleExists(newRoleName) Then
 ' Create the role
 Roles.CreateRole(newRoleName)

 ' Refresh the RoleList Grid
 DisplayRolesInGrid()
 End If

 RoleName.Text = String.Empty 
End Sub

Teraz, gdy użytkownik dodaje nową rolę, RoleList kontrolka GridView wyświetla właśnie dodaną rolę po powrocie zwrotną, przekazując wizualną opinię, że rola została pomyślnie utworzona. Aby to zilustrować, odwiedź ManageRoles.aspx stronę za pośrednictwem przeglądarki i dodaj rolę o nazwie Nadzorcy. Po kliknięciu przycisku Utwórz rolę nastąpi powrót, a siatka zostanie zaktualizowana, aby uwzględnić administratorów, a także nową rolę, nadzorców.

Dodano rolę nadzorców

Rysunek 6. Dodano rolę nadzorców (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 6. Usuwanie ról

Na tym etapie użytkownik może utworzyć nową rolę i wyświetlić wszystkie istniejące role na ManageRoles.aspx stronie. Zezwólmy użytkownikom również na usuwanie ról. Metoda Roles.DeleteRole ma dwa przeciążenia:

  • DeleteRole(roleName) — usuwa rolę roleName. Wyjątek jest zgłaszany, jeśli rola zawiera co najmniej jednego członka.
  • DeleteRole(roleName, throwOnPopulatedRole) — usuwa rolę roleName. Jeśli throwOnPopulateRole to True, zgłaszany jest wyjątek, jeśli rola zawiera co najmniej jednego członka. Jeśli parametr throwOnPopulateRole ma Falsewartość , rola zostanie usunięta bez względu na to, czy zawiera żadnych elementów członkowskich, czy nie. Wewnętrznie metoda wywołuje DeleteRole(roleName, True)metodę DeleteRole(roleName) .

Metoda DeleteRole zgłosi również wyjątek, jeśli argument roleName jest Nothing pustym ciągiem lub jeśli element roleName zawiera przecinek. Jeśli roleName nie istnieje w systemie, DeleteRole nie powiedzie się w trybie dyskretnym, bez zgłaszania wyjątku.

Rozszerzmy element GridView, ManageRoles.aspx aby uwzględnić przycisk Usuń, który po kliknięciu usuwa wybraną rolę. Zacznij od dodania przycisku Usuń do kontrolki GridView, przechodząc do okna dialogowego Pola i dodając przycisk Usuń, który znajduje się w obszarze opcji CommandField. Ustaw przycisk Usuń w lewej kolumnie i ustaw jej DeleteText właściwość na Usuń rolę .

Dodawanie przycisku Usuwania do kontrolki RoleList GridView

Rysunek 7. Dodawanie przycisku Usuwania do kontrolki RoleList GridView (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Po dodaniu przycisku Usuń znacznik deklaratywny kontrolki GridView powinien wyglądać podobnie do następującego:

<asp:GridView ID="RoleList" runat="server" AutoGenerateColumns="False">
 <Columns>
 <asp:CommandField DeleteText="Delete Role" ShowDeleteButton="True" />
 <asp:TemplateField HeaderText="Role">
 <ItemTemplate>
 <asp:Label runat="server" ID="RoleNameLabel" Text='<%# Container.DataItem %>' />
 </ItemTemplate>
 </asp:TemplateField>
 </Columns> 
</asp:GridView>

Następnie utwórz procedurę obsługi zdarzeń dla zdarzenia GridView RowDeleting . Jest to zdarzenie wywoływane po wyświetleniu po wyświetleniu po kliknięciu przycisku Usuń rolę. Dodaj następujący kod do programu obsługi zdarzeń.

Protected Sub RoleList_RowDeleting(ByVal sender As Object,ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles RoleList.RowDeleting
 ' Get the RoleNameLabel
 Dim RoleNameLabel As Label = CType(RoleList.Rows(e.RowIndex).FindControl("RoleNameLabel"),Label)

 ' Delete the role
 Roles.DeleteRole(RoleNameLabel.Text,False)

 ' Rebind the data to the RoleList grid
 DisplayRolesInGrid()
End Sub

Kod rozpoczyna się od programowego odwoływania RoleNameLabel się do kontrolki Sieci Web w wierszu, którego przycisk Usuń rolę został kliknięty. Metoda Roles.DeleteRole jest następnie wywoływana, przekazując element TextRoleNameLabel i False, usuwając w ten sposób rolę niezależnie od tego, czy istnieją użytkownicy skojarzeni z rolą. Na koniec kontrolka RoleList GridView jest odświeżona, aby rola po prostu usunięta nie pojawiała się już w siatce.

Uwaga

Przycisk Usuń rolę nie wymaga żadnego potwierdzenia od użytkownika przed usunięciem roli. Jednym z najprostszych sposobów potwierdzenia akcji jest okno dialogowe potwierdzania po stronie klienta. Aby uzyskać więcej informacji na temat tej techniki, zobacz Dodawanie potwierdzenia Client-Side podczas usuwania.

Podsumowanie

Wiele aplikacji internetowych ma pewne reguły autoryzacji lub funkcje na poziomie strony, które są dostępne tylko dla niektórych klas użytkowników. Na przykład może istnieć zestaw stron sieci Web, do których mogą uzyskiwać dostęp tylko administratorzy. Zamiast definiować te reguły autoryzacji dla poszczególnych użytkowników, często bardziej przydatne jest zdefiniowanie reguł na podstawie roli. Oznacza to, że zamiast jawnie zezwalać użytkownikom Scottowi i Jisunowi na dostęp do administracyjnych stron sieci Web, bardziej konserwowalnym podejściem jest zezwolenie członkom roli Administratorzy na dostęp do tych stron, a następnie oznaczenie Scotta i Jisun jako użytkowników należących do roli Administratorzy.

Platforma Role ułatwia tworzenie ról i zarządzanie nimi. W tym samouczku sprawdziliśmy, jak skonfigurować platformę Ról do używania SqlRoleProviderprogramu , który używa bazy danych microsoft SQL Server jako magazynu ról. Utworzyliśmy również stronę internetową, która wyświetla listę istniejących ról w systemie i umożliwia tworzenie nowych ról i usuwanie istniejących ról. W kolejnych samouczkach zobaczymy, jak przypisywać użytkowników do ról i jak stosować autoryzację opartą na rolach.

Szczęśliwe programowanie!

Dalsze informacje

Aby uzyskać więcej informacji na temat tematów omówionych w tym samouczku, zapoznaj się z następującymi zasobami:

Informacje o autorze

Scott Mitchell, autor wielu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 2.0 w ciągu 24 godzin. Scott można dotrzeć pod mitchell@4guysfromrolla.com adresem lub za pośrednictwem swojego bloga pod adresem http://ScottOnWriting.NET.

Specjalne podziękowania

Ta seria samouczków została przejrzyona przez wielu przydatnych recenzentów. W tym samouczku znajdują się recenzenci wiodących: Alicja Maziarz, Suchi Banerjee i Teresa Murphy. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi linię na mitchell@4GuysFromRolla.com