Tworzenie ról i zarządzanie nimi (C#)
Autor : Scott Mitchell
Uwaga
Od czasu napisania tego artykułu dostawcy członkostwa ASP.NET zostali zastąpioni przez ASP.NET Identity. Zdecydowanie zalecamy aktualizowanie aplikacji w celu korzystania z platformy ASP.NET Identity , a nie dostawców członkostwa w momencie pisania tego artykułu. ASP.NET Identity ma wiele zalet w porównaniu z systemem 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
- Lepsze współdziałanie z platformą ASP.Net Core
Pobierz kod lub pobierz plik PDF
W tym samouczku przedstawiono kroki niezbędne do skonfigurowania struktury Ról. Następnie utworzymy strony internetowe w celu utworzenia i usunięcia ról.
Wprowadzenie
W samouczku autoryzacji opartej na użytkownikach przyjrzeliśmy się używaniu autoryzacji adresu URL w celu ograniczenia niektórych użytkowników z zestawu stron oraz eksplorowanych technik deklaratywnych i programowych do dostosowywania funkcjonalności strony ASP.NET na podstawie użytkownika odwiedzającego. Przyznawanie 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 uzyska lub utraci autoryzację do wykonania określonego zadania, administrator musi zaktualizować odpowiednie reguły autoryzacji adresu URL, deklaratywne narzucenie i kod.
Zwykle pomaga sklasyfikować użytkowników w grupach lub rolach , a następnie stosować uprawnienia na podstawie ról. 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żytkownikach , dodamy odpowiednie reguły autoryzacji adresu URL, znaczniki deklaratywne 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. Jednak za pomocą ról można 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 dodanie nowych administratorów do witryny lub usunięcie istniejących jest proste, w tym lub usunięcie użytkownika z roli Administratorzy. Nie są konieczne żadne zmiany konfiguracji, znaczników deklaratywnych ani kodu.
ASP.NET oferuje strukturę ról do definiowania ról i kojarzenia ich z kontami użytkowników. Za pomocą platformy 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żna ograniczyć dostęp do stron na podstawie ról za pomocą reguł autoryzacji adresów URL i pokazać lub ukryć dodatkowe informacje lub funkcje na stronie na podstawie aktualnie zalogowanych ról użytkownika.
W tym samouczku przedstawiono kroki niezbędne do skonfigurowania struktury Ról. Następnie utworzymy strony internetowe w celu utworzenia i usunięcia ról. W samouczku Przypisywanie ról do użytkowników przyjrzymy się, jak dodawać i usuwać 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 użytkownika odwiedzającego. Zaczynamy!
Krok 1. Dodawanie nowych stron ASP.NET
W tym samouczku i w następnych dwóch będziemy badać różne funkcje i możliwości związane z rolami. Będziemy potrzebować serii ASP.NET stron, 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 do folderu cztery nowe strony Roles
ASP.NET, łącząc każdą stronę ze stroną wzorcową Site.master
. Nazwij strony:
ManageRoles.aspx
UsersAndRoles.aspx
CreateUserWizardWithRoles.aspx
RoleBasedAuthorization.aspx
Na tym etapie 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 o pełnym rozmiarze)
Każda strona powinna mieć w tym momencie dwie kontrolki Zawartość: jedną dla każdego z symboli ContentPlaceHolder 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 umożliwiający zalogowanie się do witryny lub wylogowanie się w zależności od tego, czy użytkownik jest uwierzytelniony. Obecność Content2
kontrolki Zawartość na stronie ASP.NET zastępuje jednak domyślne znaczniki 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.
Dla 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żda z czterech stron znaczników powinna zawierać tylko jedną kontrolkę Zawartość.
Na koniec zaktualizujmy mapę witryny (Web.sitemap
), aby uwzględnić te nowe strony sieci Web. Dodaj następujący kod XML po <siteMapNode>
dodaniu do samouczków 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 ról.
Rysunek 2. Do folderu zostały dodane Roles
cztery nowe strony (kliknij, aby wyświetlić obraz w pełnym rozmiarze)
Krok 2. Określanie i konfigurowanie dostawcy struktury ról
Podobnie jak w przypadku struktury członkostwa, platforma Roles jest zbudowana na szczycie modelu dostawcy. Zgodnie z opisem w samouczku Podstawy zabezpieczeń i ASP.NET Pomocy technicznej .NET Framework jest dostarczany z trzema wbudowanymi dostawcami ról: AuthorizationStoreRoleProvider
, WindowsTokenRoleProvider
i SqlRoleProvider
. Ta seria samouczków koncentruje się na SqlRoleProvider
bazie danych microsoft SQL Server jako magazynie ról.
Poniżej omówiono strukturę Role i SqlRoleProvider
działają tak samo jak w przypadku struktury członkostwa i SqlMembershipProvider
. .NET Framework zawiera klasęRoles
, która służy jako interfejs API dla platformy Roles. Klasa Roles
ma metody statyczne, takie jak CreateRole
, DeleteRole
, GetAllRoles
AddUserToRole
, , IsUserInRole
i tak dalej. Po wywołaniu Roles
jednej z tych metod klasa deleguje wywołanie skonfigurowanego dostawcy. Funkcja SqlRoleProvider
działa z tabelami specyficznymi dla ról (aspnet_Roles
i aspnet_UsersInRoles
) w odpowiedzi.
Aby użyć dostawcy SqlRoleProvider
w naszej aplikacji, musimy określić bazę danych, która ma być używana jako magazyn. Oczekuje SqlRoleProvider
, że określony magazyn ról będzie miał określone 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
obiekt . W związku z tym musimy po prostu poinformować strukturę Ról, aby umożliwić obsługę ról i używać jej SqlRoleProvider
z bazą SecurityTutorials.mdf
danych jako magazynem ról.
Struktura Ról 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
typu SqlRoleProvider
. Ten domyślny dostawca jest zarejestrowany w lokalizacji machine.config
(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. Dostawca AspNetSqlRoleProvider
ustawia ten atrybut na LocalSqlServer
wartość , która jest również zdefiniowana w machine.config
parametrze i domyślnie wskazuje 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ę ról bez określania Web.config
żadnych informacji o dostawcy w pliku naszej aplikacji, 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 je utworzy i doda schemat usług aplikacji. Nie chcemy jednak używać aspnet.mdf
bazy danych. Chcemy jednak użyć SecurityTutorials.mdf
bazy danych, do której już utworzyliśmy i dodaliśmy schemat usług aplikacji. Tę modyfikację można wykonać na jeden z dwóch sposobów:
- Określ wartość elementu
LocalSqlServer
nazwa parametrów połączenia wWeb.config
.LocalSqlServer
Zastępując wartość nazwy parametrów połączenia wWeb.config
programie , 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 Scotta Guthrie, Configuring ASP.NET 2.0 Application Services to Use SQL Server 2000 or SQL Server 2005 (Konfigurowanie usług aplikacji w wersji SQL Server 2000 lub SQL Server 2005). - Dodawanie nowego zarejestrowanego dostawcy typu
SqlRoleProvider
i skonfiguruj jegoconnectionStringName
ustawienie , aby wskazaćSecurityTutorials.mdf
Bazy danych. Jest to metoda zalecana i używana w samouczku Tworzenie schematu członkostwa w SQL Server i jest to podejście, którego będę używać również 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 defaultProvider
atrybutu w elemecie <roleManager>
). Ustawia SecurityTutorialsSqlRoleProvider
również ustawienie "s applicationName
" na SecurityTutorials
, które jest tym samym applicationName
ustawieniem używanym przez dostawcę członkostwa (SecurityTutorialsSqlMembershipProvider
). Mimo że element nie jest tutaj wyświetlany, <add>
SqlRoleProvider
element może również zawierać atrybut określający commandTimeout
czas trwania limitu czasu bazy danych w sekundach. Wartość domyślna to 30.
Dzięki zastosowaniu tej adiustacji konfiguracji możemy rozpocząć korzystanie z funkcji roli w naszej aplikacji.
Uwaga
Powyższy znacznik konfiguracji ilustruje użycie <roleManager
> atrybutów enabled
i defaultProvider
elementu. 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 statycznych 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ć Role
metod FindUsersInRole
klasy , 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 void CreateRoleButton_Click(object sender, EventArgs e)
{
string newRoleName = RoleName.Text.Trim();
if (!Roles.RoleExists(newRoleName))
// Create the role
Roles.CreateRole(newRoleName);
RoleName.Text = string.Empty;
}
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 null
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 void DisplayRolesInGrid()
{
RoleList.DataSource = Roles.GetAllRoles();
RoleList.DataBind();
}
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 void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
DisplayRolesInGrid();
}
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 osiągnąć, dodaj kontrolkę Etykieta sieci Web 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 void CreateRoleButton_Click(object sender, EventArgs e)
{
string newRoleName = RoleName.Text.Trim();
if (!Roles.RoleExists(newRoleName))
{
// Create the role
Roles.CreateRole(newRoleName);
// Refresh the RoleList Grid
DisplayRolesInGrid();
}
RoleName.Text = string.Empty;
}
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 null
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 void RoleList_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
// Get the RoleNameLabel
Label RoleNameLabel = RoleList.Rows[e.RowIndex].FindControl("RoleNameLabel") as Label;
// Delete the role
Roles.DeleteRole(RoleNameLabel.Text, false);
// Rebind the data to the RoleList grid
DisplayRolesInGrid();
}
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