Vytváření a správa rolí (C#)
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.
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.
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
, WindowsTokenRoleProvider
a SqlRoleProvider
. Tato série kurzů se zaměřuje na SqlRoleProvider
soubor , 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
, IsUserInRole
a 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 SqlRoleProvider
pro . 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é SqlRoleProvider
ná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 AspNetSqlRoleProvider
rolí, . ~/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 pro
LocalSqlServer
název připojovacího řetězce vWeb.config
. Přepsáním hodnoty názvu připojovacíhoLocalSqlServer
řetězce vWeb.config
souboru můžeme použít výchozího registrovaného zprostředkovatele rolí (AspNetSqlRoleProvider
) a nechat hoSecurityTutorials.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 typu
SqlRoleProvider
a nakonfigurujte jehoconnectionStringName
nastavení, které má odkazovat naSecurityTutorials.mdf
Databá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é SecurityTutorialsSqlRoleProvider
applicationName
nastavení na SecurityTutorials
hodnotu , 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
, AddUsersToRole
a 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 RemoveUserFromRole
metody , RemoveUsersFromRole
RemoveUserFromRoles
, 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 Role
FindUsersInRole
metody třídy , GetRolesForUser
, GetUsersInRole
nebo 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 Roles
CreateRole
metod třídy , GetAllRoles
a 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 ID
Text
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 CreateRole
nejprve 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.
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.
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.
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 ItemTemplate
obsah 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 RoleNameLabel
a 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.
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 jetrue
throwOnPopulateRole , vyvolá se výjimka, pokud role obsahuje jednoho nebo více členů. Pokud jefalse
throwOnPopulateRole , 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 null
ná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 .
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á Text
RoleNameLabel
false
a , čí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í:
- Zkoumání členství, rolí a profilu ASP.NET 2.0
- Postupy: Použití Správce rolí v ASP.NET 2.0
- Poskytovatelé rolí
- Technická dokumentace k elementu
<roleManager>
- Použití rozhraní API správce rolí a členství
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