Vytváření a správa rolí (VB)
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.
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.
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
, WindowsTokenRoleProvider
a 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
, , DeleteRole
GetAllRoles
, 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 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 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 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 zaregistrovaného zprostředkovatele rolí (AspNetSqlRoleProvider
) a správně pracovat sSecurityTutorials.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 typu
SqlRoleProvider
a nakonfigurujte jehoconnectionStringName
nastavení pro odkaz 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 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 ...
   <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
, 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
, 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 metody , GetRolesForUser
, GetUsersInRole
nebo IsUserInRole
třídy FindUsersInRole
Role.
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 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 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 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.
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 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.
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 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 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.
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 Nothing
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 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á 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