Sdílet prostřednictvím


Vytváření a správa rolí (C#)

Scott Mitchell

Poznámka

Od napsání tohoto článku jsou zprostředkovatelé členství ASP.NET nahrazeni ASP.NET Identity. Důrazně doporučujeme aktualizovat aplikace tak, aby používaly platformu ASP.NET Identity Platform místo zprostředkovatelů členství, které byly uvedené 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 na základě deklarací identity
  • Lepší interoperabilita s ASP.Net Core

Stáhnout kód nebo stáhnout PDF

V tomto kurzu se podíváme na 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 funkčnosti stránky ASP.NET na základě hostujícího uživatele. Udělení oprávnění k přístupu ke stránkám nebo funkcím na základě jednotlivých uživatelů se však 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í podle rolí. Například většina webových aplikací má určitou sadu stránek nebo úkolů, které jsou vyhrazeny pouze pro správce. Pomocí technik, které jsme se naučili v kurzu Autorizace na základě uživatelů , bychom přidali příslušná pravidla autorizace adres URL, deklarativní značky a kód, aby zadané uživatelské účty mohly provádět úlohy správy. Pokud by ale byl přidán nový správce nebo pokud by stávající správce potřeboval odvolat svá práva správy, museli bychom vrátit a aktualizovat konfigurační soubory a webové stránky. S rolemi bychom ale mohli vytvořit roli s názvem Správci a přiřadit tyto důvěryhodné uživatele k roli Správci. 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. S touto infrastrukturou je přidání nových správců do webu nebo odebrání existujících správců stejně jednoduché jako zahrnutí nebo odebrání uživatele z role Správci. Není nutná žádná konfigurace, deklarativní revize 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 Rolí 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ě role po rolích prostřednictvím autorizačních pravidel adresy 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.

V tomto kurzu se podíváme na 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ě role se dozvíte, jak omezit přístup ke stránkám na základě role 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 ASP.NET stránek

V tomto kurzu a v dalších dvou se budeme zabývat různými funkcemi a možnostmi souvisejícími s rolemi. K implementaci témat zkoumaných v těchto kurzech 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 , které propojí 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 snímek obrazovky 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ždou stránku předlohy ContentPlaceHolders: 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í značka ContentPlaceHolder zobrazuje odkaz pro přihlášení nebo odhlášení z webu v závislosti na tom, jestli je uživatel ověřený. Přítomnost Content2 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ích značek 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 však chceme zobrazit výchozí značku stránky předlohy LoginContent pro ContentPlaceHolder. Proto odeberte deklarativní značky pro ovládací prvek Content2 Content. Po provedení tohoto postupu by každá značka čtyř stránek měla obsahovat pouze jeden ovládací prvek Obsah.

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

<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 ukazuje obrázek 2, navigace vlevo teď obsahuje položky pro kurzy Role.

Navigace vlevo 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 zprostředkovatele. Jak je popsáno v kurzu Základy zabezpečení a podpora ASP.NET, rozhraní .NET Framework se dodává se třemi integrovanými poskytovateli rolí: AuthorizationStoreRoleProvider, WindowsTokenRoleProvidera SqlRoleProvider. Tato série kurzů se zaměřuje na SqlRoleProvidersoubor , který jako úložiště rolí používá databázi Microsoft SQL Server.

Pod ní se vztahuje architektura rolí a SqlRoleProvider funguje stejně jako architektura členství a SqlMembershipProvider. Rozhraní .NET Framework obsahuje Roles třídu, která slouží jako rozhraní API pro architekturu rolí. Třída Roles má statické metody jako CreateRole, DeleteRole, GetAllRoles, AddUserToRole, IsUserInRolea tak dále. Při vyvolání Roles jedné z těchto metod třída deleguje volání nakonfigurovaného zprostředkovatele. V SqlRoleProvider odpovědi funguje s tabulkami specifickými pro roli (aspnet_Roles a aspnet_UsersInRoles).

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

Architektura rolí 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 atribut elementu <roleManager>enabled nastavit 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 zprostředkovatele 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 SQL Server 2005 Express Edition databázi ve App_Data složce s názvem aspnet.mdf.

V důsledku toho, pokud jednoduše povolíme architekturu Rolí, aniž bychom zadali informace 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 databázi používat aspnet.mdf , 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 registrovaného zprostředkovatele rolí (AspNetSqlRoleProvider) a nechat ho SecurityTutorials.mdf správně pracovat s databází. Další informace o této technice najdete v blogovém příspěvku Scotta GuthriehoKonfigurace ASP.NET 2.0 Application Services pro použití SQL Server 2000 nebo SQL Server 2005.
  • Přidání nového registrovaného zprostředkovatele typuSqlRoleProvidera nakonfigurujte jehoconnectionStringNamenastavení, které má odkazovat 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 přístup, který budu používat i v tomto kurzu.

Přidejte do souboru následující značky Web.config konfigurace rolí. Tato značka 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 ...

 <roleManager enabled="true" defaultProvider="SecurityTutorialsSqlRoleProvider">    
 <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 SecurityTutorialshodnotu , což je stejné applicationName nastavení, které používá poskytovatel členství (SecurityTutorialsSqlMembershipProvider). I když se zde nezobrazuje, <add> element pro SqlRoleProvider může také obsahovat commandTimeout atribut určující dobu časového limitu databáze v sekundách. Výchozí hodnota je 30.

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

Poznámka

Výše uvedené značky konfigurace znázorňují 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 statický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 RoleFindUsersInRolemetody třídy , GetRolesForUser, GetUsersInRolenebo IsUserInRole .

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

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 null 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 void DisplayRolesInGrid()
{
    RoleList.DataSource = Roles.GetAllRoles();
    RoleList.DataBind();
}

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 void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    DisplayRolesInGrid();
}

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 na Container.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 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;    
}

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 nullná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 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();
}

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