Vytváření a správa rolí (VB)

Scott Mitchell

Poznámka

Od napsání tohoto článku se zprostředkovatelé členství ASP.NET nahradili službou ASP.NET Identity. Důrazně doporučujeme aktualizovat aplikace tak, aby používaly platformu ASP.NET Identity Platform místo zprostředkovatelů členství, které se objevovalo v době psaní tohoto článku. ASP.NET Identity má oproti systému členství ASP.NET řadu výhod, mezi které patří:

  • Lepší výkon
  • Vylepšená rozšiřitelnost a testovatelnost
  • Podpora OAuth, OpenID Connect a dvojúrovňového ověřování
  • Podpora identit založených na deklarací identity
  • Lepší interoperabilita s ASP.Net Core

Stažení kódu nebo stažení souboru PDF

Tento kurz zkoumá kroky potřebné ke konfiguraci architektury rolí. Potom vytvoříme webové stránky pro vytváření a odstraňování rolí.

Úvod

V kurzu Autorizace na základě uživatelů jsme se podívali na použití autorizace url k omezení určitých uživatelů ze sady stránek a prozkoumali jsme deklarativní a programové techniky pro úpravu funkcí ASP.NET stránky na základě hostujícího uživatele. Udělení oprávnění pro přístup ke stránkám nebo funkcím pro jednotlivé uživatele se ale může stát noční můrou údržby ve scénářích, kdy existuje mnoho uživatelských účtů nebo kdy se oprávnění uživatelů často mění. Kdykoli uživatel získá nebo ztratí oprávnění k provedení konkrétní úlohy, musí správce aktualizovat příslušná autorizační pravidla adresy URL, deklarativní kód a kód.

Obvykle pomáhá klasifikovat uživatele do skupin nebo rolí a pak použít oprávnění na základě rolí. Například většina webových aplikací má určitou sadu stránek nebo úkolů, které jsou vyhrazené jenom pro správce. Pomocí technik, které jsme se naučili v kurzu Autorizace na základě uživatelů , bychom přidali příslušná autorizační pravidla adresy URL, deklarativní kód a kód, aby zadané uživatelské účty mohly provádět úlohy správy. Pokud by se ale přidal nový správce nebo pokud by stávající správce potřeboval odvolat práva správce, museli bychom vrátit a aktualizovat konfigurační soubory a webové stránky. Pomocí rolí bychom ale mohli vytvořit roli s názvem Správci a přiřadit tyto důvěryhodné uživatele k roli Administrators. Dále přidáme příslušná autorizační pravidla adresy URL, deklarativní kód a kód, aby role Administrators mohla provádět různé úlohy správy. Když je tato infrastruktura nastavená, je přidání nových správců na web nebo odebrání existujících správců stejně jednoduché jako zahrnutí nebo odebrání uživatele z role Správce. Není nutná žádná konfigurace, deklarativní kód ani změny kódu.

ASP.NET nabízí architekturu rolí pro definování rolí a jejich přidružení k uživatelským účtům. Pomocí architektury Role můžeme vytvářet a odstraňovat role, přidávat uživatele do role nebo je z role odebírat, určit sadu uživatelů, kteří patří do určité role, a zjistit, jestli uživatel patří do určité role. Jakmile je architektura rolí nakonfigurovaná, můžeme omezit přístup ke stránkám na základě rolí po rolích prostřednictvím pravidel autorizace adres URL a zobrazit nebo skrýt další informace nebo funkce na stránce na základě aktuálně přihlášených rolí uživatele.

Tento kurz zkoumá kroky potřebné ke konfiguraci architektury rolí. Potom vytvoříme webové stránky pro vytváření a odstraňování rolí. V kurzu Přiřazování rolí uživatelům se podíváme na to, jak přidávat a odebírat uživatele z rolí. A v kurzu Autorizace na základě rolí uvidíme, jak omezit přístup ke stránkám na základě rolí po rolích a jak upravit funkčnost stránky v závislosti na roli hostujícího uživatele. Pusťme se do toho.

Krok 1: Přidání nových stránek ASP.NET

V tomto kurzu a dalších dvou se budeme zabývat různými funkcemi a možnostmi souvisejícími s rolemi. K implementaci témat prozkoumaných v rámci těchto kurzů budeme potřebovat řadu ASP.NET stránek. Pojďme tyto stránky vytvořit a aktualizovat mapu webu.

Začněte vytvořením nové složky v projektu s názvem Roles. Dále do složky přidejte čtyři nové ASP.NET stránky Roles a propojíte každou stránku se stránkou Site.master předlohy. Pojmenujte stránky:

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

V tuto chvíli by Průzkumník řešení vašeho projektu měly vypadat podobně jako na obrázku 1.

Do složky Role byly přidány čtyři nové stránky.

Obrázek 1: Do složky byly přidány Roles čtyři nové stránky (kliknutím zobrazíte obrázek v plné velikosti)

Každá stránka by v tomto okamžiku měla mít dva ovládací prvky Obsahu, jeden pro každý ContentPlaceHolders stránky předlohy: MainContent a LoginContent.

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

Vzpomeňte LoginContent si, že výchozí kód ContentPlaceHolder zobrazuje odkaz pro přihlášení nebo odhlášení z webu v závislosti na tom, jestli je uživatel ověřený. Content2 Přítomnost ovládacího prvku Obsah na stránce ASP.NET však přepíše výchozí značky stránky předlohy. Jak jsme probrali v kurzu Přehled ověřování pomocí formulářů, přepsání výchozího kódu je užitečné na stránkách, kde nechceme v levém sloupci zobrazovat možnosti související s přihlášením.

Pro tyto čtyři stránky ale chceme zobrazit výchozí značky stránky předlohy pro LoginContent ContentPlaceHolder. Proto odeberte deklarativní kód pro Content2 ovládací prvek Obsahu. Jakmile to uděláte, měl by každý ze čtyř stránek obsahovat jenom jeden ovládací prvek Obsahu.

Nakonec aktualizujeme mapu webu (Web.sitemap), aby zahrnovala tyto nové webové stránky. Za kód, který <siteMapNode> jsme přidali pro kurzy členství, přidejte následující kód XML.

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

Když je mapa webu aktualizovaná, navštivte web prostřednictvím prohlížeče. Jak je znázorněno na obrázku 2, navigace na levé straně teď obsahuje položky pro kurzy Role.

Navigace na levé straně teď obsahuje položky pro kurzy role.

Obrázek 2: Do složky byly přidány Roles čtyři nové stránky (kliknutím zobrazíte obrázek v plné velikosti)

Krok 2: Určení a konfigurace zprostředkovatele architektury rolí

Stejně jako architektura členství je architektura rolí sestavena na základě modelu poskytovatele. Jak je popsáno v kurzu Základy zabezpečení a podpora ASP.NET, rozhraní .NET Framework se dodává se třemi předdefinovanými poskytovateli rolí: AuthorizationStoreRoleProvider, WindowsTokenRoleProvidera SqlRoleProvider. Tato série kurzů se zaměřuje na SqlRoleProvider, který jako úložiště rolí používá databázi Microsoft SQL Server.

Pod textem se vztahuje architektura Rolí a SqlRoleProvider funguje stejně jako rozhraní Membership a SqlMembershipProvider. Rozhraní .NET Framework obsahuje Roles třídu, která slouží jako rozhraní API pro rozhraní Roles Framework. Třída Roles sdílí metody jako CreateRole, , DeleteRoleGetAllRoles, AddUserToRole, IsUserInRole, atd. Při vyvolání Roles jedné z těchto metod třída deleguje volání nakonfigurovaného zprostředkovatele. V reakci na to SqlRoleProvider funguje s tabulkami specifickými pro roli (aspnet_Roles a aspnet_UsersInRoles).

Aby bylo možné použít SqlRoleProvider poskytovatele v naší aplikaci, musíme zadat databázi, která se má použít jako úložiště. Očekává SqlRoleProvider , že zadané úložiště rolí bude mít určité databázové tabulky, zobrazení a uložené procedury. Tyto požadované databázové objekty je možné přidat pomocí nástrojeaspnet_regsql.exe . V tomto okamžiku již máme databázi se schématem nezbytným pro SqlRoleProvider. Zpět v kurzu Vytvoření schématu členství v SQL Server jsme vytvořili databázi s názvem SecurityTutorials.mdf a použili aspnet_regsql.exe jsme ji k přidání aplikačních služeb, která obsahovala databázové objekty vyžadované objektem SqlRoleProvider. Proto potřebujeme jenom říct architektuře rolí, aby povolila podporu rolí a použila SqlRoleProvider s SecurityTutorials.mdf databází jako úložištěm rolí.

Architektura Roles se konfiguruje prostřednictvím elementu <roleManager> v souboru aplikace Web.config . Ve výchozím nastavení je podpora rolí zakázaná. Pokud ho chcete povolit, musíte nastavit atribut elementu <roleManager>enabled takto true :

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

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

Ve výchozím nastavení mají všechny webové aplikace zprostředkovatele rolí s názvem AspNetSqlRoleProvider typu SqlRoleProvider. Tento výchozí zprostředkovatel je zaregistrovaný v machine.config (nachází se na adrese %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>

Atribut poskytovatele connectionStringName určuje použité úložiště rolí. Zprostředkovatel AspNetSqlRoleProvider nastaví tento atribut na LocalSqlServer, který je také definován v machine.config a ve výchozím nastavení odkazuje na databázi SQL Server 2005 Express Edition ve App_Data složce s názvem aspnet.mdf.

V důsledku toho, pokud jednoduše povolíme architekturu Roles bez zadání informací o poskytovateli v souboru naší aplikace Web.config , aplikace použije výchozího registrovaného zprostředkovatele AspNetSqlRoleProviderrolí, . ~/App_Data/aspnet.mdf Pokud databáze neexistuje, modul runtime ASP.NET ji automaticky vytvoří a přidá schéma aplikačních služeb. Nechceme ale používat aspnet.mdf databázi, ale chceme použít SecurityTutorials.mdf databázi, kterou jsme už vytvořili a do které jsme přidali schéma aplikačních služeb. Tuto změnu lze provést jedním ze dvou způsobů:

  • Zadejte hodnotu proLocalSqlServernázev připojovacího řetězce vWeb.config. Přepsáním hodnoty názvu připojovacího LocalSqlServer řetězce v Web.configsouboru můžeme použít výchozího zaregistrovaného zprostředkovatele rolí (AspNetSqlRoleProvider) a správně pracovat s SecurityTutorials.mdf databází. Další informace o této technice najdete v blogovém příspěvku Scotta GuthriehoKonfigurace aplikačních služeb ASP.NET 2.0 pro použití SQL Server 2000 nebo SQL Server 2005.
  • Přidání nového registrovaného zprostředkovatele typuSqlRoleProvidera nakonfigurujte jehoconnectionStringNamenastavení pro odkaz naSecurityTutorials.mdfDatabáze. Tento přístup jsem doporučil a použil v kurzu Vytvoření schématu členství v SQL Server a je to také přístup, který budu používat v tomto kurzu.

Přidejte do souboru následující značky Web.config konfigurace rolí. Tento kód zaregistruje nového zprostředkovatele s názvem 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>

Výše uvedený kód definuje SecurityTutorialsSqlRoleProvider jako výchozího zprostředkovatele (prostřednictvím atributu defaultProvider v elementu <roleManager> ). Nastaví také SecurityTutorialsSqlRoleProviderapplicationName nastavení na SecurityTutorials, což je stejné applicationName nastavení, které používá zprostředkovatel členství (SecurityTutorialsSqlMembershipProvider). I když se zde nezobrazuje, <add> element pro SqlRoleProvider může také obsahovat atribut, který commandTimeout určuje dobu trvání časového limitu databáze v sekundách. Výchozí hodnota je 30.

Po použití tohoto kódu konfigurace jsme připraveni začít používat funkce rolí v rámci naší aplikace.

Poznámka

Výše uvedený konfigurační kód znázorňuje použití <roleManager> atributů a defaultProvider elementůenabled. Existuje řada dalších atributů, které ovlivňují způsob, jakým architektura rolí přidružuje informace o rolích pro jednotlivé uživatele. Tato nastavení prozkoumáme v kurzu Autorizace na základě role.

Krok 3: Prozkoumání rozhraní API rolí

Funkce architektury Rolí jsou zpřístupněny prostřednictvím Roles třídy, která obsahuje třináct sdílených metod pro provádění operací založených na rolích. Když se podíváme na vytváření a odstraňování rolí v krocích 4 a 6, použijeme CreateRole metody a DeleteRole , které přidají nebo odeberou roli ze systému.

Pokud chcete získat seznam všech rolí v systému, použijte metoduGetAllRoles (viz Krok 5). MetodaRoleExists vrátí logickou hodnotu označující, zda existuje zadaná role.

V dalším kurzu se podíváme, jak přidružit uživatele k rolím. Metody Roles třídy AddUserToRole, AddUserToRoles, AddUsersToRolea AddUsersToRoles přidají jednoho nebo více uživatelů k jedné nebo více rolím. Pokud chcete odebrat uživatele z rolí, použijte RemoveUserFromRolemetody , RemoveUsersFromRoleRemoveUserFromRoles, nebo RemoveUsersFromRoles .

V kurzu Autorizace na základě rolí se podíváme na způsoby, jak programově zobrazit nebo skrýt funkce na základě aktuálně přihlášené role uživatele. K tomu můžeme použít metody , GetRolesForUser, GetUsersInRolenebo IsUserInRole třídy FindUsersInRoleRole.

Poznámka

Mějte na paměti, že kdykoli je vyvolána jedna z těchto metod, Roles třída deleguje volání nakonfigurovaného zprostředkovatele. V našem případě to znamená, že se hovor odesílá do SqlRoleProvider. Potom SqlRoleProvider provede příslušnou operaci databáze na základě vyvolané metody. Výsledkem kódu Roles.CreateRole("Administrators")SqlRoleProvider je například spuštění aspnet_Roles_CreateRole uložené procedury, která vloží nový záznam do aspnet_Roles tabulky s názvem Administrators .

Zbývající část tohoto kurzu se zabývá používáním RolesCreateRolemetod třídy , GetAllRolesa DeleteRole ke správě rolí v systému.

Krok 4: Vytváření nových rolí

Role nabízejí způsob, jak libovolně seskupit uživatele. Nejčastěji se toto seskupení používá pro pohodlnější způsob použití autorizačních pravidel. Abychom ale mohli role používat jako autorizační mechanismus, musíme nejprve definovat, jaké role v aplikaci existují. ASP.NET bohužel neobsahuje ovládací prvek CreateRoleWizard. Abychom mohli přidat nové role, musíme vytvořit vhodné uživatelské rozhraní a sami vyvolat rozhraní API rolí. Dobrou zprávou je, že je to velmi snadné.

Poznámka

I když neexistuje žádný webový ovládací prvek CreateRoleWizard, existuje nástroj pro správu webu ASP.NET, což je místní ASP.NET aplikace navržená tak, aby pomáhala s prohlížením a správou konfigurace webové aplikace. Nejsem však velkým fanouškem nástroje pro správu webu ASP.NET ze dvou důvodů. Za prvé, je to trochu buggy a uživatelské prostředí nechává hodně na přání. Za druhé, nástroj pro správu webu ASP.NET je navržený tak, aby fungoval pouze místně, což znamená, že pokud potřebujete vzdáleně spravovat role na živém webu, budete muset vytvořit vlastní webové stránky správy rolí. Z těchto dvou důvodů se tento kurz a další zaměří na vytváření potřebných nástrojů pro správu rolí na webové stránce, nikoli na nástroj pro správu ASP.NET webu.

ManageRoles.aspx Otevřete stránku ve Roles složce a přidejte na stránku ovládací prvek TextBox a Button Web. Vlastnost ovládacího prvku ID TextBox nastavte na RoleName a vlastnosti a vlastnosti Tlačítka IDText na CreateRoleButton a Vytvořit roli v uvedeném pořadí. V tomto okamžiku by deklarativní značky vaší stránky měly vypadat nějak takto:

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

Potom poklikáním CreateRoleButton na ovládací prvek Button v Designer vytvořte obslužnou rutinu Click události a pak přidejte následující kód:

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

Výše uvedený kód začíná přiřazením oříznutého názvu role zadaného RoleName v textovém poli k newRoleName proměnné. Dále je volána metoda třídyRoleExists, aby se zjistilo, Roles jestli už role newRoleName v systému existuje. Pokud role neexistuje, vytvoří se voláním CreateRole metody. Pokud je CreateRole metoda předána název role, která již existuje v systému, ProviderException vyvolá se výjimka. To je důvod, proč kód před voláním CreateRolenejprve zkontroluje, jestli role v systému ještě neexistuje. Obslužná rutina Click události končí vymazáním RoleName vlastnosti TextBox Text .

Poznámka

Možná vás zajímá, co se stane, když uživatel nezadá do textového RoleName pole žádnou hodnotu. Pokud je Nothing hodnota předaná do CreateRole metody nebo prázdný řetězec, vyvolá se výjimka. Podobně platí, že pokud název role obsahuje čárku, vyvolá se výjimka. V důsledku toho by stránka měla obsahovat ověřovací ovládací prvky, které zajistí, že uživatel zadá roli a že neobsahuje žádné čárky. Odcházím jako cvičení pro čtenáře.

Vytvoříme roli s názvem Administrators. ManageRoles.aspx Navštivte stránku v prohlížeči, do textového pole zadejte Správci (viz Obrázek 3) a klikněte na tlačítko Vytvořit roli.

Vytvoření role správců

Obrázek 3: Vytvoření role Správce (kliknutím zobrazíte obrázek v plné velikosti)

Co se stane? Dojde k zpětnému odeslání, ale neexistuje žádné vizuální upozornění na to, že se role skutečně přidala do systému. Tuto stránku v kroku 5 aktualizujeme, aby zahrnovala vizuální zpětnou vazbu. Prozatím ale můžete ověřit, že se role vytvořila, tak, že přejdete do SecurityTutorials.mdf databáze a zobrazíte data z aspnet_Roles tabulky. Jak ukazuje obrázek 4, aspnet_Roles tabulka obsahuje záznam pro právě přidané role Administrators.

Tabulka aspnet_Roles obsahuje řádek pro správce.

Obrázek 4: Tabulka aspnet_Roles obsahuje řádek pro správce (kliknutím zobrazíte obrázek v plné velikosti)

Krok 5: Zobrazení rolí v systému

ManageRoles.aspx Rozšiřme stránku tak, aby zahrnovala seznam aktuálních rolí v systému. Chcete-li toho dosáhnout, přidejte na stránku ovládací prvek GridView a nastavte jeho ID vlastnost na RoleList. Dále přidejte metodu do třídy kódu na pozadí stránky s názvem DisplayRolesInGrid pomocí následujícího kódu:

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

Metoda Roles třídy GetAllRoles vrátí všechny role v systému jako pole řetězců. Toto pole řetězců je pak vázáno na GridView. Chcete-li vytvořit vazbu seznamu rolí na GridView při prvním načtení stránky, musíme volat metodu DisplayRolesInGrid z obslužné rutiny Page_Load události stránky. Následující kód volá tuto metodu při první návštěvě stránky, ale ne při následných zpětných dotazech.

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

S tímto kódem přejděte na stránku v prohlížeči. Jak ukazuje obrázek 5, měla by se zobrazit mřížka s jedním sloupcem označeným Položka. Mřížka obsahuje řádek pro roli Správci, které jsme přidali v kroku 4.

GridView zobrazuje role v jednom sloupci.

Obrázek 5: Zobrazení GridView zobrazuje role v jednom sloupci (kliknutím zobrazíte obrázek v plné velikosti)

GridView zobrazí samostatný sloupec s popiskem Item, protože vlastnost GridView AutoGenerateColumns je nastavena na True (výchozí), což způsobí, že GridView automaticky vytvoří sloupec pro každou vlastnost v jeho DataSource. Pole má jednu vlastnost, která představuje prvky v poli, a proto jeden sloupec v GridView.

Při zobrazení dat pomocí objektu GridView dávám přednost explicitní definici sloupců, než aby se implicitně vygenerovaly objektem GridView. Explicitní definování sloupců je mnohem jednodušší formátovat data, změnit uspořádání sloupců a provádět další běžné úlohy. Proto aktualizujeme deklarativní značky GridView tak, aby jeho sloupce byly explicitně definovány.

Začněte nastavením vlastnosti GridView AutoGenerateColumns na Hodnotu False. Dále přidejte pole TemplateField do mřížky, nastavte jeho HeaderText vlastnost na Role a nakonfigurujte ji ItemTemplate tak, aby zobrazovala obsah pole. Chcete-li toho dosáhnout, přidejte do ItemTemplate objektu ovládací prvek Label Web s názvem RoleNameLabel a vytvořte vazbu jeho Text vlastnosti naContainer.DataItem.

Tyto vlastnosti a ItemTemplateobsah lze nastavit deklarativně nebo prostřednictvím dialogového okna Pole objektu GridView a rozhraní Upravit šablony. Pokud se chcete dostat do dialogového okna Pole, klikněte na odkaz Upravit sloupce v inteligentní značce GridView. Dále zrušte zaškrtnutí políčka Automaticky generovat pole, aby se vlastnost nastavovala AutoGenerateColumns na Hodnotu False a přidejte TemplateField do objektu GridView a nastavte jeho HeaderText vlastnost na Role. Pokud chcete definovat obsah objektu ItemTemplate, zvolte možnost Upravit šablony z inteligentní značky GridView. Přetáhněte ovládací prvek Label Web na ItemTemplate, nastavte jeho ID vlastnost na RoleNameLabela nakonfigurujte jeho nastavení vazby dat tak, aby jeho Text vlastnost byla vázaná na Container.DataItem.

Bez ohledu na to, jaký přístup použijete, by výsledné deklarativní značky GridView měly vypadat podobně jako následující, až budete hotovi.

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

Poznámka

Obsah pole se zobrazí pomocí syntaxe <%# Container.DataItem %>vazby dat . Podrobný popis, proč se tato syntaxe používá při zobrazení obsahu pole vázaného na Objekt GridView, je nad rámec tohoto kurzu. Další informace o této záležitosti najdete v tématu Vytvoření vazby skalárního pole na datový webový ovládací prvek.

RoleList V současné době je Objekt GridView vázán pouze na seznam rolí při první návštěvě stránky. Při každém přidání nové role potřebujeme aktualizovat mřížku. Chcete-li toho dosáhnout, aktualizujte Click obslužnou rutinu CreateRoleButton události button tak, aby volal metoduDisplayRolesInGrid, pokud je vytvořena nová role.

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

Když teď uživatel přidá novou roli, RoleList gridview zobrazí právě přidanou roli při zpětném odeslání a poskytne vizuální zpětnou vazbu, že se role úspěšně vytvořila. Chcete-li to ilustrovat, přejděte na ManageRoles.aspx stránku v prohlížeči a přidejte roli s názvem Supervisors. Po kliknutí na tlačítko Vytvořit roli se vytvoří postback a mřížka se aktualizuje tak, aby zahrnovala jak Správce, tak i novou roli Supervizoři.

Role Supervisors byla přidána.

Obrázek 6: Byla přidána role Vedoucí (kliknutím zobrazíte obrázek v plné velikosti)

Krok 6: Odstranění rolí

V tomto okamžiku může uživatel vytvořit novou roli a zobrazit všechny existující role ze ManageRoles.aspx stránky. Umožníme uživatelům také odstranit role. Metoda Roles.DeleteRole má dvě přetížení:

  • DeleteRole(roleName) – odstraní roli název_role. Pokud role obsahuje jednoho nebo více členů, vyvolá se výjimka.
  • DeleteRole(roleName, throwOnPopulatedRole) – odstraní roli název_role. Pokud je TruethrowOnPopulateRole , vyvolá se výjimka, pokud role obsahuje jednoho nebo více členů. Pokud je FalsethrowOnPopulateRole , pak se role odstraní bez ohledu na to, jestli obsahuje nějaké členy nebo ne. Interně DeleteRole(roleName) volá DeleteRole(roleName, True)metoda .

Metoda DeleteRole také vyvolá výjimku, pokud je Nothingnázev_role nebo prázdný řetězec nebo pokud název_role obsahuje čárku. Pokud roleName v systému neexistuje, DeleteRole dojde k selhání bez upozornění, aniž by došlo k výjimce.

Pojďme rozšířit GridView v ManageRoles.aspx souboru o tlačítko Odstranit, které po kliknutí odstraní vybranou roli. Začněte tím, že do ovládacího prvku GridView přidáte tlačítko Odstranit tak, že přejdete do dialogového okna Pole a přidáte tlačítko Odstranit, které se nachází pod možností CommandField. Nastavte tlačítko Odstranit úplně vlevo ve sloupci a nastavte jeho DeleteText vlastnost na Odstranit roli .

Přidání tlačítka Odstranit do prvku RoleList GridView

Obrázek 7: Přidání tlačítka Odstranit do RoleList GridView (kliknutím zobrazíte obrázek v plné velikosti)

Po přidání tlačítka Odstranit by deklarativní kód objektu GridView měl vypadat nějak takto:

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

Dále vytvořte obslužnou rutinu události pro událost GridView RowDeleting . Jedná se o událost, která se vyvolá při zpětném odeslání po kliknutí na tlačítko Odstranit roli. Do obslužné rutiny události přidejte následující kód.

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

Kód začíná programovým odkazem na RoleNameLabel webový ovládací prvek v řádku, na jehož tlačítko Odstranit roli bylo kliknuto. Pak se Roles.DeleteRole vyvolá metoda , která předá TextRoleNameLabelFalsea , čímž se role odstraní bez ohledu na to, jestli jsou k roli přidruženi uživatelé. Nakonec se RoleList objekt GridView aktualizuje tak, aby se právě odstraněná role už v mřížce zobrazovala.

Poznámka

Tlačítko Odstranit roli nevyžaduje žádné potvrzení od uživatele před odstraněním role. Jedním z nejjednodušších způsobů, jak akci potvrdit, je dialogové okno potvrzení na straně klienta. Další informace o této technice najdete v tématu Přidání Client-Side potvrzení při odstraňování.

Souhrn

Mnoho webových aplikací má určitá autorizační pravidla nebo funkce na úrovni stránky, které jsou k dispozici pouze určitým třídám uživatelů. Může například existovat sada webových stránek, ke kterým mají přístup jenom správci. Místo definování těchto autorizačních pravidel na základě jednotlivých uživatelů je často užitečnější definovat pravidla založená na roli. To znamená, že místo toho, aby uživatelé Scott a Jisun explicitně povolili přístup k webovým stránkám pro správu, je udržovatelný přístup k těmto stránkám povolit členům role Administrators a poté označit Scotta a Jisuna jako uživatele, kteří patří do role Administrators.

Architektura Rolí usnadňuje vytváření a správu rolí. V tomto kurzu jsme prozkoumali, jak nakonfigurovat architekturu rolí tak, aby používala SqlRoleProvider, která jako úložiště rolí používá databázi Microsoft SQL Server. Vytvořili jsme také webovou stránku, která obsahuje seznam existujících rolí v systému a umožňuje vytváření nových rolí a odstranění existujících rolí. V dalších kurzech se dozvíte, jak přiřadit uživatele k rolím a jak použít autorizaci na základě rolí.

Všechno nejlepší na programování!

Další čtení

Další informace o tématech probíraných v tomto kurzu najdete v následujících zdrojích informací:

O autorovi

Scott Mitchell, autor několika knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Scotta můžete zastihnout na adrese mitchell@4guysfromrolla.com nebo prostřednictvím svého blogu na adrese http://ScottOnWriting.NET.

Zvláštní poděkování

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Mezi hlavní recenzenty tohoto kurzu patří Alicja Maziarz, Suchi Banerjee a Teresa Murphy. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi čáru na mitchell@4GuysFromRolla.com