Udostępnij za pośrednictwem


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.

Do folderu Roles zostały dodane cztery nowe strony

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.

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, WindowsTokenRoleProvideri SqlRoleProvider. Ta seria samouczków koncentruje się na SqlRoleProviderbazie 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, GetAllRolesAddUserToRole, , IsUserInRolei 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 SqlRoleProviderobiekt . 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 LocalSqlServerwartość , 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:

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 SecurityTutorialsSqlRoleProviderró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. 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ć Role metod FindUsersInRoleklasy , 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 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ę.

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

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

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

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