Tworzenie ról i zarządzanie nimi (VB)
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.
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.
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
, WindowsTokenRoleProvider
i SqlRoleProvider
. Ta seria samouczków koncentruje się na SqlRoleProvider
programie , 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
, , AddUserToRole
DeleteRole
GetAllRoles
, , IsUserInRole
i 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 SqlRoleProvider
program . 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.mdf
SecurityTutorials.mdf
bazy danych i dodania do niego schematu usług aplikacji. Tę modyfikację można wykonać na jeden z dwóch sposobów:
- Określanie wartości dla elementu
LocalSqlServer
nazwa parametrów połączenia wWeb.config
.LocalSqlServer
Zastępując wartość nazwy parametrów połączenia w programieWeb.config
, możemy użyć domyślnego zarejestrowanego dostawcy ról (AspNetSqlRoleProvider
) i prawidłowo pracować z baząSecurityTutorials.mdf
danych. Aby uzyskać więcej informacji na temat tej techniki, zobacz wpis w blogu Scott Guthrie, Configuring ASP.NET 2.0 Application Services to Use SQL Server 2000 or SQL Server 2005 (Konfigurowanie usług aplikacji w wersji 2.0 do korzystania z SQL Server 2000 lub SQL Server 2005). - Dodawanie nowego zarejestrowanego dostawcy typu
SqlRoleProvider
i skonfiguruj jegoconnectionStringName
ustawienie , aby wskazaćSecurityTutorials.mdf
elementBazy danych. Jest to podejście zalecane i używane w samouczku Tworzenie schematu członkostwa w SQL Server i jest to podejście, którego będę również używać w tym samouczku.
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 ...
   <roleManager enabled="true" defaultProvider="SecurityTutorialsSqlRoleProvider">
     <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 SecurityTutorialsSqlRoleProvider
applicationName
również ustawienie SecurityTutorials
na , 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. AddUserToRole
Metody Roles
klasy , AddUserToRoles
, AddUsersToRole
i AddUsersToRoles
dodają co najmniej jednego użytkownika do co najmniej jednej roli. Aby usunąć użytkowników z ról, użyj RemoveUserFromRole
metod , RemoveUserFromRoles
, RemoveUsersFromRole
lub 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 FindUsersInRole
klasy Role , GetRolesForUser
, GetUsersInRole
lub 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
, GetAllRoles
i 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 ID
Text
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ę.
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.
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.
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 ItemTemplate
zawartość 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ć ItemTemplate
zawartość elementu , wybierz opcję Edytuj szablony z tagu inteligentnego GridView. Przeciągnij kontrolkę Etykieta sieci Web na ItemTemplate
wł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.
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 toTrue
, zgłaszany jest wyjątek, jeśli rola zawiera co najmniej jednego członka. Jeśli parametr throwOnPopulateRole maFalse
wartość , rola zostanie usunięta bez względu na to, czy zawiera żadnych elementów członkowskich, czy nie. Wewnętrznie metoda wywołujeDeleteRole(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ę .
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 Text
RoleNameLabel
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 SqlRoleProvider
programu , 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:
- Badanie członkostwa, ról i profilu ASP.NET 2.0
- Instrukcje: używanie Menedżera ról w programie ASP.NET 2.0
- Dostawcy ról
- Dokumentacja techniczna elementu
<roleManager>
- Korzystanie z interfejsów API członkostwa i menedżera ról
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