Vytvoření schématu členství v SQL Serveru (VB)
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
Tento kurz začíná prozkoumáním technik pro přidání potřebného schématu do databáze, aby bylo možné použít SqlMembershipProvider. Potom prozkoumáme klíčové tabulky ve schématu a probereme jejich účel a důležitost. Tento kurz končí pohledem na to, jak říct ASP.NET aplikaci, kterého zprostředkovatele má rozhraní členství používat.
Úvod
Předchozí dva kurzy zkoumaly ověřování pomocí formulářů k identifikaci návštěvníků webu. Architektura ověřování formulářů usnadňuje vývojářům přihlášení uživatele k webu a jejich zapamatování při návštěvách stránek pomocí lístků ověřování. Třída FormsAuthentication
obsahuje metody pro vygenerování lístku a jeho přidání do souborů cookie návštěvníka. Nástroj FormsAuthenticationModule
prověří všechny příchozí požadavky a pro ty s platným lístkem ověřování vytvoří a přidruží GenericPrincipal
FormsIdentity
objekt a k aktuálnímu požadavku. Ověřování pomocí formulářů je pouze mechanismus pro udělení lístku ověřování návštěvníkovi při přihlášení a při následných žádostech parsování lístku za účelem určení identity uživatele. Aby webová aplikace podporovala uživatelské účty, stále potřebujeme implementovat úložiště uživatelů a přidat funkce pro ověřování přihlašovacích údajů, registraci nových uživatelů a nesčetné množství dalších úloh souvisejících s uživatelskými účty.
Před ASP.NET 2.0 byli vývojáři připravení implementovat všechny tyto úlohy související s uživatelským účtem. Naštěstí ASP.NET tým tento nedostatek rozpoznal a zavedl architekturu členství s ASP.NET 2.0. Rozhraní členství je sada tříd v rozhraní .NET Framework, které poskytují programové rozhraní pro provádění základních úloh souvisejících s uživatelskými účty. Tato architektura je sestavená na základě modelu zprostředkovatele, který vývojářům umožňuje zapojit přizpůsobenou implementaci do standardizovaného rozhraní API.
Jak je popsáno v kurzu Základy zabezpečení a podpora ASP.NET, rozhraní .NET Framework se dodává se dvěma integrovanými poskytovateli členství: ActiveDirectoryMembershipProvider
a SqlMembershipProvider
. Jak název napovídá, SqlMembershipProvider
používá databáze Microsoft SQL Server jako úložiště uživatelů. Abychom mohli tohoto zprostředkovatele používat v aplikaci, musíme mu říct, jakou databázi má použít jako úložiště. Jak si můžete představit, očekává se SqlMembershipProvider
, že databáze úložiště uživatelů bude obsahovat určité databázové tabulky, zobrazení a uložené procedury. Toto očekávané schéma musíme přidat do vybrané databáze.
Tento kurz začíná prozkoumáním technik pro přidání potřebného schématu do databáze, aby bylo možné použít SqlMembershipProvider
. Potom prozkoumáme klíčové tabulky ve schématu a probereme jejich účel a důležitost. Tento kurz končí pohledem na to, jak říct ASP.NET aplikaci, kterého zprostředkovatele má rozhraní členství používat.
Pusťme se do toho.
Krok 1: Rozhodnutí, kam umístit úložiště uživatelů
Data ASP.NET aplikace se běžně ukládají do několika tabulek v databázi. Při implementaci schématu SqlMembershipProvider
databáze se musíme rozhodnout, jestli se má schéma členství umístit do stejné databáze jako data aplikace nebo do alternativní databáze.
Doporučujeme, aby bylo schéma členství ve stejné databázi jako data aplikace, a to z následujících důvodů:
- Udržovatelnost aplikace, jejíž data jsou zapouzdřená v jedné databázi, je jednodušší pochopit, udržovat a nasadit než aplikace, která má dvě samostatné databáze.
- Relační integrita umístěním tabulek souvisejících s členstvím ve stejné databázi jako tabulky aplikací je možné nastavit omezení cizího klíče mezi primárními klíči v tabulkách souvisejících s členstvím a tabulkami souvisejících aplikací.
Oddělení uživatelského úložiště a aplikačních dat do samostatných databází má smysl jenom v případě, že máte více aplikací, které používají samostatné databáze, ale potřebujete sdílet společné úložiště uživatelů.
Vytvoření databáze
Aplikace, která jsme vytvářeli od druhého kurzu, ještě nepotřebovala databázi. Teď ho ale potřebujeme pro uživatelské úložiště. Vytvoříme ho a pak do něj přidáme schéma vyžadované poskytovatelem SqlMembershipProvider
(viz krok 2).
Poznámka
V této sérii kurzů budeme k ukládání tabulek aplikace a schématu SqlMembershipProvider
používat databázi Microsoft SQL Server 2005 Express Edition. Toto rozhodnutí bylo učiněno ze dvou důvodů: zaprvé, vzhledem k jeho nákladům - zdarma - Express Edition je nejčtenější verzí SQL Server 2005; za druhé, SQL Server 2005 Express Edition databáze lze umístit přímo do webové aplikace App_Data
složek, což je cinch pro zabalení databáze a webové aplikace do jednoho souboru ZIP a opětovné nasazení bez jakýchkoli zvláštních pokynů k nastavení nebo možnosti konfigurace. Pokud byste chtěli použít verzi SQL Server, která není v Express Edition, neváhejte. Postup je prakticky shodný. Schéma SqlMembershipProvider
bude fungovat s libovolnou verzí Microsoft SQL Server 2000 a novější.
V Průzkumník řešení klikněte pravým tlačítkem na App_Data
složku a zvolte Přidat novou položku. (Pokud v projektu nevidíte složkuApp_Data
, klikněte pravým tlačítkem na projekt v Průzkumník řešení, vyberte Přidat složku ASP.NET a vyberte App_Data
.) V dialogovém okně Přidat novou položku zvolte přidat nový SQL Database s názvem SecurityTutorials.mdf
. V tomto kurzu přidáme SqlMembershipProvider
schéma do této databáze. V dalších kurzech vytvoříme další tabulky pro zachycení dat aplikace.
Obrázek 1: Přidání nové SQL Database pojmenované SecurityTutorials.mdf
databáze do App_Data
složky (kliknutím zobrazíte obrázek v plné velikosti)
Přidání databáze do App_Data
složky ji automaticky zahrne do zobrazení Průzkumníka databází. (V jiné verzi než Express Edition sady Visual Studio se Průzkumník databáze nazývá Průzkumník serveru.) Přejděte do Průzkumníka databází a rozbalte právě přidanou SecurityTutorials
databázi. Pokud průzkumníka databáze na obrazovce nevidíte, přejděte do nabídky Zobrazení a zvolte Průzkumník databáze nebo stiskněte Kombinaci kláves Ctrl+Alt+S. Jak ukazuje obrázek 2, SecurityTutorials
databáze je prázdná – neobsahuje žádné tabulky, žádná zobrazení a žádné uložené procedury.
Obrázek 2: Databáze SecurityTutorials
je aktuálně prázdná (kliknutím zobrazíte obrázek v plné velikosti)
Krok 2: Přidání schématuSqlMembershipProvider
do databáze
Vyžaduje SqlMembershipProvider
, aby se do databáze úložiště uživatelů nainstalovala konkrétní sada tabulek, zobrazení a uložených procedur. Tyto požadované databázové objekty lze přidat pomocí aspnet_regsql.exe
nástroje. Tento soubor se nachází ve %WINDIR%\Microsoft.Net\Framework\v2.0.50727\
složce.
Poznámka
Nástroj aspnet_regsql.exe
nabízí jak funkce příkazového řádku, tak grafické uživatelské rozhraní. Grafické rozhraní je uživatelsky přívětivější a v tomto kurzu se budeme zabývat. Rozhraní příkazového řádku je užitečné, když je potřeba automatizovat přidání SqlMembershipProvider
schématu, například ve skriptech sestavení nebo ve scénářích automatizovaného testování.
Nástroj aspnet_regsql.exe
slouží k přidání nebo odebrání ASP.NET aplikačních služeb do zadané databáze SQL Server. ASP.NET aplikační služby zahrnují schémata pro SqlMembershipProvider
a společně SqlRoleProvider
se schématy pro zprostředkovatele založené na SQL pro jiné architektury ASP.NET 2.0. Musíme nástroji poskytnout dva bity informací aspnet_regsql.exe
:
- Zda chceme přidat nebo odebrat aplikační služby a
- Databáze, ze které se má přidat nebo odebrat schéma aplikačních služeb
Při zobrazení výzvy k použití databáze nás nástroj požádá o zadání názvu serveru, aspnet_regsql.exe
na kterém se databáze nachází, přihlašovacích údajů zabezpečení pro připojení k databázi a názvu databáze. Pokud používáte ne expressovou edici SQL Server, měli byste již tyto informace znát, protože se jedná o stejné informace, které musíte poskytnout prostřednictvím připojovací řetězec při práci s databází prostřednictvím webové stránky ASP.NET. Určení názvu serveru a databáze při použití SQL Server 2005 Express Edition databáze ve App_Data
složce je ale trochu důležitější.
Následující část zkoumá jednoduchý způsob, jak zadat název serveru a databáze pro SQL Server 2005 Express Edition databáze ve App_Data
složce. Pokud nepoužíváte SQL Server 2005 Express Edition můžete přeskočit k části Instalace aplikačních služeb.
Určení názvu serveru a databáze pro databázi SQL Server 2005 Express Edition veApp_Data
složce
Abychom mohli tento nástroj používat aspnet_regsql.exe
, potřebujeme znát názvy serverů a databází. Název serveru je localhost\InstanceName
. InstanceName je SQLExpress
s největší pravděpodobností . Pokud jste však nainstalovali SQL Server 2005 Express Edition ručně (to znamená, že jste ho nenainstalovali automaticky při instalaci sady Visual Studio), je možné, že jste vybrali jiný název instance.
Určení názvu databáze je o něco složitější. Databáze ve App_Data
složce mají obvykle název databáze, který obsahuje globálně jedinečný identifikátor spolu s cestou k souboru databáze. Tento název databáze musíme určit, abychom mohli přidat schéma aplikačních služeb prostřednictvím aspnet_regsql.exe
.
Nejjednodušší způsob, jak zjistit název databáze, je prozkoumat ho prostřednictvím SQL Server Management Studio. SQL Server Management Studio poskytuje grafické rozhraní pro správu databází SQL Server 2005, ale není dodáván s Express Edition SQL Server 2005. Dobrou zprávou je, že si můžete stáhnout bezplatnou edici Express Edition SQL Server Management Studio.
Poznámka
Pokud máte na počítači nainstalovanou také verzi SQL Server 2005, která není verze Express Edition, je pravděpodobně nainstalována plná verze nástroje Management Studio. K určení názvu databáze můžete použít úplnou verzi, a to podle stejných kroků, které jsou popsány níže pro edici Express.
Začněte zavřením sady Visual Studio, abyste zajistili, že všechny zámky uložené sadou Visual Studio pro databázový soubor jsou zavřené. Pak spusťte SQL Server Management Studio a připojte se k localhost\InstanceName
databázi, abyste SQL Server 2005 Express Edition. Jak jsme uvedli dříve, je pravděpodobné, že název instance je SQLExpress
. U možnosti Ověřování vyberte Ověřování systému Windows.
Obrázek 3: Připojení k instanci SQL Server 2005 Express Edition (kliknutím zobrazíte obrázek v plné velikosti)
Po připojení k instanci SQL Server 2005 Express Edition zobrazí Management Studio složky pro databáze, nastavení zabezpečení, objekty serveru atd. Pokud rozbalíte kartu Databáze, uvidíte, že SecurityTutorials.mdf
databáze není zaregistrovaná v instanci databáze – nejprve ji musíme připojit.
Klikněte pravým tlačítkem na složku Databases (Databáze) a v místní nabídce zvolte Attach (Připojit). Zobrazí se dialogové okno Připojit databáze. Tady klikněte na tlačítko Přidat, přejděte do SecurityTutorials.mdf
databáze a klikněte na OK. Obrázek 4 znázorňuje dialogové okno Připojit databáze po SecurityTutorials.mdf
výběru databáze. Obrázek 5 ukazuje Průzkumník objektů management studia po úspěšném připojení databáze.
Obrázek 4: Připojení SecurityTutorials.mdf
databáze (kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 5: Databáze SecurityTutorials.mdf
se zobrazí ve složce Databáze (kliknutím zobrazíte obrázek v plné velikosti)
Jak ukazuje obrázek 5, SecurityTutorials.mdf
databáze má poměrně nechutný název. Pojďme ho změnit na zapamatovatelnější (a snadněji psát) název. Klikněte pravým tlačítkem na databázi, v místní nabídce zvolte Přejmenovat a přejmenujte ji SecurityTutorialsDatabase
. Tím se nezmění název souboru, pouze název, který databáze používá k identifikaci pro SQL Server.
Obrázek 6: Přejmenování databáze na SecurityTutorialsDatabase
(kliknutím zobrazíte obrázek v plné velikosti)
V tomto okamžiku známe názvy serveru a databáze pro SecurityTutorials.mdf
soubor databáze: localhost\InstanceName
a SecurityTutorialsDatabase
. Teď jsme připraveni nainstalovat aplikační služby prostřednictvím nástroje aspnet_regsql.exe
.
Instalace aplikačních služeb
Nástroj spustíte aspnet_regsql.exe
tak, že přejdete do nabídky Start a zvolíte Spustit. Do textového pole zadejte %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe
a klikněte na OK. Případně můžete pomocí Průzkumníka Windows přejít k podrobnostem do příslušné složky a poklikejte na aspnet_regsql.exe
soubor. Oba přístupy budou mít stejné výsledky.
Spuštění nástroje aspnet_regsql.exe
bez argumentů příkazového řádku spustí grafické uživatelské rozhraní Průvodce instalací ASP.NET SQL Server. Průvodce usnadňuje přidání nebo odebrání ASP.NET aplikačních služeb v zadané databázi. První obrazovka průvodce znázorněná na obrázku 7 popisuje účel nástroje.
Obrázek 7: Přidání schématu členství pomocí Průvodce nastavením ASP.NET SQL Server (kliknutím zobrazíte obrázek v plné velikosti)
Druhý krok průvodce se ptá, jestli chceme přidat nebo odebrat aplikační služby. Vzhledem k tomu, že chceme přidat tabulky, zobrazení a uložené procedury nezbytné pro SqlMembershipProvider
, zvolte možnost Konfigurovat SQL Server pro aplikační služby. Pokud později budete chtít toto schéma z databáze odebrat, spusťte znovu tohoto průvodce, ale místo toho zvolte možnost Odebrat informace o aplikačních službách z existující databáze.
Obrázek 8: Volba možnosti Konfigurovat SQL Server pro aplikační služby (kliknutím zobrazíte obrázek v plné velikosti)
Třetí krok vyzve k zadání informací o databázi: název serveru, ověřovací informace a název databáze. Pokud jste postupovali podle tohoto kurzu a přidali SecurityTutorials.mdf
jste databázi do App_Data
, připojili jste ji k localhost\InstanceName
a přejmenovali ji na SecurityTutorialsDatabase
, použijte následující hodnoty:
- Server:
localhost\InstanceName
- Ověřování systému Windows
- Databáze:
SecurityTutorialsDatabase
Obrázek 9: Zadejte informace o databázi (kliknutím zobrazíte obrázek v plné velikosti)
Po zadání informací o databázi klikněte na Další. Poslední krok shrnuje kroky, které budou podniknuty. Kliknutím na Další nainstalujte aplikační služby a kliknutím na Dokončit průvodce dokončete.
Poznámka
Pokud jste k připojení databáze a přejmenování souboru databáze použili Management Studio, nezapomeňte databázi odpojit a zavřít Management Studio a teprve potom znovu otevřít sadu Visual Studio. Pokud chcete databázi odpojit SecurityTutorialsDatabase
, klikněte pravým tlačítkem na název databáze a v nabídce Úlohy zvolte Odpojit.
Po dokončení průvodce se vraťte do sady Visual Studio a přejděte do Průzkumníka databáze. Rozbalte složku Tabulky. Měli byste vidět řadu tabulek, jejichž názvy začínají předponou aspnet_
. Podobně můžete ve složkách Zobrazení a Uložené procedury najít různá zobrazení a uložené procedury. Tyto databázové objekty tvoří schéma aplikačních služeb. V kroku 3 prozkoumáme databázové objekty specifické pro členství a roli.
Obrázek 10: Do databáze byly přidány různé tabulky, zobrazení a uložené procedury (kliknutím zobrazíte obrázek v plné velikosti)
Poznámka
Grafické aspnet_regsql.exe
uživatelské rozhraní nástroje nainstaluje celé schéma aplikačních služeb. Při provádění aspnet_regsql.exe
z příkazového řádku ale můžete určit, které konkrétní součásti aplikačních služeb se mají nainstalovat (nebo odebrat). Proto pokud chcete přidat pouze tabulky, zobrazení a uložené procedury nezbytné pro SqlMembershipProvider
zprostředkovatele a SqlRoleProvider
, spusťte aspnet_regsql.exe
z příkazového řádku. Případně můžete příslušnou podmnožinu skriptů pro vytváření T-SQL, které používá, aspnet_regsql.exe
spustit ručně. Tyto skripty jsou umístěné ve WINDIR%\Microsoft.Net\Framework\v2.0.50727\
složce s názvy jako InstallCommon.sql
, InstallMembership.sql
, InstallRoles.sql
, InstallProfile.sql
, InstallSqlState.sql
atd.
V tomto okamžiku jsme vytvořili databázové objekty, které SqlMembershipProvider
potřebuje . Přesto ale musíme platformě členství dát pokyn, aby používala SqlMembershipProvider
(oproti ) ActiveDirectoryMembershipProvider
a aby SqlMembershipProvider
používala SecurityTutorials
databázi. V kroku 4 se podíváme na to, jak určit poskytovatele, který se má použít, a jak přizpůsobit nastavení vybraného zprostředkovatele. Nejprve se ale podrobněji podíváme na právě vytvořené databázové objekty.
Krok 3: Zobrazení základních tabulek schématu
Při práci s architekturami Členství a Role v aplikaci ASP.NET jsou podrobnosti implementace zapouzdřeny zprostředkovatelem. V budoucích kurzech budeme s těmito architekturami komunikovat prostřednictvím tříd a Roles
rozhraní .NET FrameworkMembership
. Při použití těchto rozhraní API vysoké úrovně se nemusíme zabývat podrobnostmi nízké úrovně, jako jsou dotazy spouštěné nebo které tabulky a upravují SqlMembershipProvider
SqlRoleProvider
.
Vzhledem k tomu bychom mohli bez obav používat architektury Členství a Role, aniž bychom prozkoumali schéma databáze vytvořené v kroku 2. Při vytváření tabulek pro ukládání dat aplikací však může být potřeba vytvořit entity, které se vztahují k uživatelům nebo rolím. Při vytváření omezení cizího SqlMembershipProvider
SqlRoleProvider
klíče mezi tabulkami dat aplikací a tabulkami vytvořenými v kroku 2 pomáhá znát schémata a . Kromě toho v určitých výjimečných případech může být nutné, abychom se s úložištěm uživatele a role mohli komunikovat přímo na úrovni databáze (místo prostřednictvím Membership
tříd nebo Roles
).
Rozdělení uživatelského úložiště do aplikací
Architektury Členství a Role jsou navržené tak, aby bylo možné sdílet úložiště jednoho uživatele a role mezi mnoha různými aplikacemi. ASP.NET aplikace, která používá rozhraní Membership nebo Roles, musí určovat, jaký oddíl aplikace se má použít. Stručně řečeno, více webových aplikací může používat stejné úložiště uživatele a role. Obrázek 11 znázorňuje úložiště uživatelů a rolí, která jsou rozdělená do tří aplikací: HRSite, CustomerSite a SalesSite. Každá z těchto tří webových aplikací má své vlastní jedinečné uživatele a role, ale všechny fyzicky ukládají informace o svých uživatelských účtech a rolích do stejných databázových tabulek.
Obrázek 11: Uživatelské účty mohou být rozdělené do více aplikací (kliknutím zobrazíte obrázek v plné velikosti)
Tyto aspnet_Applications
oddíly definuje tabulka. Každá aplikace, která používá databázi k ukládání informací o uživatelských účtech, je reprezentována řádkem v této tabulce. Tabulka aspnet_Applications
má čtyři sloupce: ApplicationId
, ApplicationName
, LoweredApplicationName
a Description
.ApplicationId
je typu uniqueidentifier
a je primárním klíčem tabulky. ApplicationName
Pro každou aplikaci poskytuje jedinečný popisný název.
Ostatní tabulky související s členstvím a rolemi odkazují zpět na ApplicationId
pole v aspnet_Applications
. Například aspnet_Users
tabulka, která obsahuje záznam pro každý uživatelský účet, obsahuje pole cizího ApplicationId
klíče; ditto pro aspnet_Roles
tabulku. Pole ApplicationId
v těchto tabulkách určuje oddíl aplikace, do které patří uživatelský účet nebo role.
Ukládání informací o uživatelském účtu
Informace o uživatelském účtu jsou uloženy ve dvou tabulkách: aspnet_Users
a aspnet_Membership
. Tabulka aspnet_Users
obsahuje pole, která obsahují základní informace o uživatelském účtu. Tři nejdůležitější sloupce jsou:
UserId
UserName
ApplicationId
UserId
je primární klíč (a typu uniqueidentifier
). UserName
je typu nvarchar(256)
a spolu s heslem tvoří přihlašovací údaje uživatele. (V tabulce je uloženo aspnet_Membership
heslo uživatele.) ApplicationId
prodá uživatelský účet s konkrétní aplikací v aspnet_Applications
nástroji . Pro sloupce a ApplicationId
existuje složené UNIQUE
omezeníUserName
. To zajišťuje, že v dané aplikaci je každé uživatelské jméno jedinečné, ale umožňuje použít stejné UserName
v různých aplikacích.
Tabulka aspnet_Membership
obsahuje další informace o uživatelském účtu, jako je heslo uživatele, e-mailová adresa, datum a čas posledního přihlášení atd. Mezi záznamy v aspnet_Users
tabulkách a aspnet_Membership
existuje korespondence 1:1. Tuto relaci zajišťuje UserId
pole v aspnet_Membership
, které slouží jako primární klíč tabulky. aspnet_Users
Podobně jako tabulka obsahuje ApplicationId
pole, aspnet_Membership
které tyto informace spojuje s konkrétním oddílem aplikace.
Zabezpečení hesel
Informace o heslech jsou uložené v tabulce aspnet_Membership
. Umožňuje SqlMembershipProvider
ukládání hesel do databáze pomocí jedné z následujících tří technik:
- Vymazat – heslo se uloží v databázi jako prostý text. Tuto možnost rozhodně nedoporučujem používat. Pokud dojde k ohrožení databáze – ať už hackerem, který najde zadní vrátka, nebo nespokojeným zaměstnancem s přístupem k databázi – jsou k dispozici přihlašovací údaje každého uživatele.
- Hashované – hesla se hashují pomocí jednosměrného hashovacího algoritmu a náhodně generované hodnoty soli. Tato hodnota hash (spolu se solí) je uložena v databázi.
- Šifrované – šifrovaná verze hesla je uložená v databázi.
Použitá technika ukládání hesel závisí na nastavení zadaném SqlMembershipProvider
v Web.config
. Na přizpůsobení nastavení se podíváme SqlMembershipProvider
v kroku 4. Výchozím chováním je uložení hodnoty hash hesla.
Sloupce zodpovědné za uložení hesla jsou Password
, PasswordFormat
a PasswordSalt
. PasswordFormat
je pole typu int
, jehož hodnota označuje techniku použitou k uložení hesla: 0 pro clear; 1 pro hashed; 2 pro Encrypted. PasswordSalt
je přiřazen náhodně generovaný řetězec bez ohledu na použitou techniku ukládání hesel; hodnota se PasswordSalt
používá pouze při výpočtu hodnoty hash hesla. Password
Nakonec sloupec obsahuje skutečná data hesla, ať už jde o heslo ve formátu prostého textu, hodnotu hash hesla nebo šifrované heslo.
Tabulka 1 ukazuje, jak můžou tyto tři sloupce vypadat pro různé techniky ukládání při ukládání hesla MySecret. .
Technika< úložiště_o3a_p /> | Heslo<_o3a_p /> | PasswordFormat<_o3a_p /> | PasswordSalt<_o3a_p /> |
---|---|---|---|
Vymazat | MySecret! | 0 | tTnkPlesqissc2y2YMEygA== |
Hashed | 2oXm6sZHWbTHFgjgkGQsc2Ec9ZM= | 1 | wFgjUfhdUFOCKQiI61vtiQ== |
Šifrované | 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUUU3e7Inza9j9BKp | 2 | LSRzhGS/aa/oqAXGLHJNBw== |
Tabulka 1: Ukázkové hodnoty polí Password-Related při ukládání hesla MySecret!
Poznámka
Konkrétní šifrovací nebo hashovací algoritmus používaný objektem SqlMembershipProvider
je určen nastavením v elementu <machineKey>
.
Ukládání rolí a přidružení rolí
Architektura Roles umožňuje vývojářům definovat sadu rolí a určit, kteří uživatelé patří do jakých rolí. Tyto informace se zachytává v databázi prostřednictvím dvou tabulek: aspnet_Roles
a aspnet_UsersInRoles
. Každý záznam v aspnet_Roles
tabulce představuje roli pro konkrétní aplikaci. Tabulka má podobně jako aspnet_Users
tabulka aspnet_Roles
tři sloupce, které jsou relevantní pro naši diskuzi:
RoleId
RoleName
ApplicationId
RoleId
je primární klíč (a typu uniqueidentifier
). RoleName
je typu nvarchar(256)
. A ApplicationId
pro propojení uživatelského účtu s konkrétní aplikací v aspnet_Applications
nástroji . Sloupce a ApplicationId
mají složené UNIQUE
omezeníRoleName
, které zajišťuje, že v dané aplikaci je každý název role jedinečný.
Tabulka aspnet_UsersInRoles
slouží jako mapování mezi uživateli a rolemi. Existují pouze dva sloupce – UserId
a RoleId
– a společně tvoří složený primární klíč.
Krok 4: Zadání poskytovatele a přizpůsobení jeho nastavení
Ve všech architekturách, které podporují model zprostředkovatele , jako jsou architektury Membership (Členství) a Roles (Role) chybí podrobnosti o implementaci, a místo toho delegujte tuto odpovědnost na třídu zprostředkovatele. V případě rozhraní Membership
Membership třída definuje rozhraní API pro správu uživatelských účtů, ale neprovádí přímou interakci s žádným uživatelským úložištěm. Membership
Metody třídy místo toho předá požadavek nakonfigurovaného zprostředkovatele – budeme používat SqlMembershipProvider
. Když vyvoláme jednu z metod ve Membership
třídě, jak rozhraní Membership ví, že má delegovat volání na SqlMembershipProvider
?
Třída Membership
má Providers
vlastnost , která obsahuje odkaz na všechny registrované třídy zprostředkovatele, které jsou k dispozici pro použití v rámci členství. Každý zaregistrovaný poskytovatel má přidružený název a typ. Název nabízí způsob, jak odkazovat na konkrétního zprostředkovatele v kolekci Providers
, zatímco typ identifikuje třídu zprostředkovatele. Každý zaregistrovaný poskytovatel navíc může obsahovat nastavení konfigurace. Nastavení konfigurace pro architekturu členství zahrnují PasswordFormat
mimo jiné a requiresUniqueEmail
. Úplný seznam nastavení konfigurace používaných nástrojem najdete v tabulce SqlMembershipProvider
2.
Obsah Providers
vlastnosti se určuje prostřednictvím nastavení konfigurace webové aplikace. Ve výchozím nastavení mají všechny webové aplikace zprostředkovatele s názvem AspNetSqlMembershipProvider
typu SqlMembershipProvider
. Tento výchozí zprostředkovatel členství je zaregistrovaný v machine.config
(nachází se na adrese %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG
):
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
Jak ukazuje výše uvedený kód, <membership>
element definuje nastavení konfigurace pro rozhraní Membership, zatímco <providers>
podřízený prvek určuje registrované zprostředkovatele. Zprostředkovatelé mohou být přidáni nebo odebráni pomocí elementů <add>
nebo <remove>
. Pomocí elementu <clear>
odeberte všechny aktuálně registrované zprostředkovatele. Jak ukazuje výše uvedený kód, machine.config
přidá zprostředkovatele s názvem AspNetSqlMembershipProvider
typu SqlMembershipProvider
.
Kromě name
atributů a type
obsahuje element atributy, <add>
které definují hodnoty pro různá nastavení konfigurace. Tabulka 2 uvádí dostupná SqlMembershipProvider
nastavení konfigurace specifická a jejich popis.
Poznámka
Všechny výchozí hodnoty uvedené v tabulce 2 odkazují na výchozí hodnoty definované ve SqlMembershipProvider
třídě . Všimněte si, že ne všechna nastavení konfigurace v AspNetSqlMembershipProvider
souboru odpovídají výchozím hodnotám SqlMembershipProvider
třídy . Pokud například není zadaný ve zprostředkovateli členství, nastaví se requiresUniqueEmail
výchozí hodnota true. Objekt AspNetSqlMembershipProvider
však tuto výchozí hodnotu přepíše explicitním zadáním hodnoty false
.
Nastavení<_o3a_p /> | Popis<_o3a_p /> |
---|---|
ApplicationName |
Vzpomeňte si, že architektura členství umožňuje rozdělit úložiště jednoho uživatele do více aplikací. Toto nastavení určuje název oddílu aplikace používaného zprostředkovatelem členství. Pokud tato hodnota není explicitně zadaná, nastaví se za běhu na hodnotu virtuální kořenové cesty aplikace. |
commandTimeout |
Určuje hodnotu časového limitu příkazu SQL (v sekundách). Výchozí hodnota je 30. |
connectionStringName |
Název připojovací řetězec v elementu<connectionStrings> , který se použije pro připojení k databázi úložiště uživatelů. Tato hodnota se vyžaduje. |
description |
Poskytuje popis registrovaného poskytovatele, který je vhodný pro člověka. |
enablePasswordRetrieval |
Určuje, jestli uživatelé můžou načíst zapomenuté heslo. Výchozí hodnota je false . |
enablePasswordReset |
Určuje, jestli uživatelé můžou resetovat heslo. Výchozí hodnota je true . |
maxInvalidPasswordAttempts |
Maximální počet neúspěšných pokusů o přihlášení, ke kterým může u daného uživatele dojít během zadané passwordAttemptWindow doby před uzamčením uživatele. Výchozí hodnota je 5. |
minRequiredNonalphanumericCharacters |
Minimální počet nealfanumerických znaků, které musí být uvedeny v hesle uživatele. Tato hodnota musí být mezi 0 a 128; výchozí hodnota je 1. |
minRequiredPasswordLength |
Minimální počet znaků požadovaných v hesle. Tato hodnota musí být mezi 0 a 128; Výchozí hodnota je 7. |
name |
Název registrovaného zprostředkovatele. Tato hodnota se vyžaduje. |
passwordAttemptWindow |
Počet minut, během kterých se sledují neúspěšné pokusy o přihlášení. Pokud uživatel zadá v tomto zadaném okně neplatné přihlašovací údaje maxInvalidPasswordAttempts , dojde k jeho uzamčení. Výchozí hodnota je 10. |
PasswordFormat |
Formát úložiště hesel: Clear , Hashed nebo Encrypted . Výchozí formát je Hashed . |
passwordStrengthRegularExpression |
Pokud je zadaný, použije se tento regulární výraz k vyhodnocení síly hesla vybraného uživatelem při vytváření nového účtu nebo při změně hesla. Výchozí hodnota je prázdný řetězec. |
requiresQuestionAndAnswer |
Určuje, jestli uživatel musí při načítání nebo resetování hesla odpovědět na bezpečnostní otázku. Výchozí hodnota je true . |
requiresUniqueEmail |
Určuje, jestli všechny uživatelské účty v daném oddílu aplikace musí mít jedinečnou e-mailovou adresu. Výchozí hodnota je true . |
type |
Určuje typ zprostředkovatele. Tato hodnota se vyžaduje. |
Tabulka 2: Nastavení členství a SqlMembershipProvider
konfigurace
Kromě nástroje AspNetSqlMembershipProvider
mohou být další zprostředkovatelé členství zaregistrováni na základě aplikace po aplikaci přidáním podobného kódu do Web.config
souboru.
Poznámka
Architektura rolí funguje v podstatě stejně: v machine.config
systému existuje výchozí zaregistrovaný zprostředkovatel role a zaregistrovaní zprostředkovatelé se můžou přizpůsobit v závislosti na aplikaci v Web.config
nástroji . Architekturu Rolí a její konfigurační značky prozkoumáme podrobně v dalším kurzu.
PřizpůsobeníSqlMembershipProvider
nastavení
Výchozí SqlMembershipProvider
(AspNetSqlMembershipProvider
) má svůj connectionStringName
atribut nastavený na LocalSqlServer
. AspNetSqlMembershipProvider
Stejně jako zprostředkovatel je název LocalSqlServer
připojovací řetězec definován v machine.config
souboru .
<connectionStrings>
<add name="LocalSqlServer"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient"/>
</connectionStrings>
Jak vidíte, tento připojovací řetězec definuje databázi SQL 2005 Express Edition umístěnou na adrese |DataDirectory|aspnetdb.mdf. Řetězec |Datový adresář| se přeloží za běhu tak, aby odkazovat na ~/App_Data/
adresář, takže cesta k databázi |DataDirectory|aspnetdb.mdf se přeloží na ~/App_Data
/aspnet.mdf
.
Pokud jsme v souboru aplikace Web.config
nezadali žádné informace o poskytovateli členství, aplikace použije výchozího registrovaného zprostředkovatele AspNetSqlMembershipProvider
členství . ~/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žít aspnet.mdf
databázi, ale databázi, SecurityTutorials.mdf
kterou jsme vytvořili v kroku 2. Tuto změnu lze provést jedním ze dvou způsobů:
- Zadejte hodnotu pro
LocalSqlServer
připojovací řetězec název.Web.config
PřepsánímLocalSqlServer
hodnoty názvu připojovací řetězec vWeb.config
souboru můžeme použít výchozího registrovaného zprostředkovatele členství (AspNetSqlMembershipProvider
) a správně pracovat sSecurityTutorials.mdf
databází. Tento přístup je v pořádku, pokud se spokojíte s nastavením konfigurace zadaným vAspNetSqlMembershipProvider
. 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
SqlMembershipProvider
a nakonfigurujte jehoconnectionStringName
nastavení pro odkaz naSecurityTutorials.mdf
Databáze. Tento přístup je užitečný ve scénářích, kdy chcete kromě databázového připojovací řetězec přizpůsobit i další vlastnosti konfigurace. Ve svých vlastních projektech vždy používám tento přístup kvůli jeho flexibilitě a čitelnosti.
Než přidáme nového registrovaného zprostředkovatele, který odkazuje na SecurityTutorials.mdf
databázi, musíme nejprve přidat odpovídající hodnotu připojovací řetězec v oddílu <connectionStrings>
v Web.config
souboru . Následující kód přidá nový připojovací řetězec s názvem SecurityTutorialsConnectionString
, který odkazuje na databázi SQL Server 2005 Express Edition SecurityTutorials.mdf
ve App_Data
složce .
<configuration>
<connectionStrings>
<add name="SecurityTutorialsConnectionString"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
... Configuration markup removed for brevity ... </system.web>
</configuration>
Poznámka
Pokud používáte alternativní soubor databáze, podle potřeby aktualizujte připojovací řetězec. Další informace o vytvoření správného připojovací řetězec najdete v tématu ConnectionStrings.com.
Dále do Web.config
souboru přidejte následující konfigurační kód členství. Tento kód zaregistruje nového zprostředkovatele s názvem SecurityTutorialsSqlMembershipProvider
.
<configuration>
<connectionStrings>
<add name="SecurityTutorialsConnectionString"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<membership defaultProvider="SecurityTutorialsSqlMembershipProvider">
<providers>
<!-- Add a customized SqlMembershipProvider -->
<add name="SecurityTutorialsSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SecurityTutorialsConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="SecurityTutorials"
requiresUniqueEmail="true"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
... Configuration markup removed for brevity ...
</system.web>
</configuration>
Kromě registrace SecurityTutorialsSqlMembershipProvider
zprostředkovatele definuje výše uvedený kód SecurityTutorialsSqlMembershipProvider
jako výchozího zprostředkovatele (prostřednictvím atributu defaultProvider
v elementu <membership>
). Vzpomeňte si, že architektura členství může mít více registrovaných poskytovatelů. Vzhledem k tomu AspNetSqlMembershipProvider
, že je zaregistrovaný jako první zprostředkovatel v machine.config
nástroji , slouží jako výchozí zprostředkovatel, pokud neurčíme jinak.
V současné době má naše aplikace dva zaregistrované poskytovatele: AspNetSqlMembershipProvider
a SecurityTutorialsSqlMembershipProvider
. Před registrací SecurityTutorialsSqlMembershipProvider
zprostředkovatele jsme však mohli vymazat všechny dříve zaregistrované zprostředkovatele přidáním elementu<clear />
bezprostředně před náš <add>
prvek. To by vymazal AspNetSqlMembershipProvider
ze seznamu registrovaných poskytovatelů, což znamená, že SecurityTutorialsSqlMembershipProvider
by byl jediným registrovaným zprostředkovatelem členství. Pokud bychom použili tento přístup, nemuseli bychom označit SecurityTutorialsSqlMembershipProvider
jako výchozího poskytovatele, protože by to byl jediný registrovaný zprostředkovatel členství. Další informace o používání <clear />
najdete v tématu Použití <clear />
při přidávání zprostředkovatelů.
Všimněte si, že SecurityTutorialsSqlMembershipProvider
connectionStringName
nastavení odkazuje na právě přidaný SecurityTutorialsConnectionString
název připojovací řetězec a že jeho applicationName
nastavení bylo nastaveno na hodnotu SecurityTutorials. Kromě toho requiresUniqueEmail
bylo nastavení nastaveno na true
. Všechny ostatní možnosti konfigurace jsou stejné jako hodnoty v AspNetSqlMembershipProvider
. Pokud chcete, můžete zde provést jakékoli změny konfigurace. Můžete například zvýšit sílu hesla vyžadováním dvou nealfanumerických znaků místo jednoho nebo zvětšením délky hesla na osm znaků místo sedmi.
Poznámka
Vzpomeňte si, že architektura členství umožňuje rozdělit úložiště jednoho uživatele do více aplikací. Nastavení zprostředkovatele applicationName
členství určuje, jakou aplikaci zprostředkovatel používá při práci s uživatelským úložištěm. Je důležité, abyste explicitně nastavili hodnotu nastavení applicationName
konfigurace, protože pokud applicationName
není explicitně nastavená, přiřadí se za běhu virtuální kořenové cestě webové aplikace. Funguje to správně, pokud se nezmění virtuální kořenová cesta aplikace, ale pokud přesunete aplikaci na jinou cestu, applicationName
změní se i nastavení. Když k tomu dojde, zprostředkovatel členství začne pracovat s jiným oddílem aplikace, než byl dříve použit. Uživatelské účty vytvořené před přesunem se budou nacházet v jiném oddílu aplikace a tito uživatelé se už nebudou moct k webu přihlásit. Podrobnější informace o této záležitosti najdete v tématu Vždy nastavit applicationName
vlastnost při konfiguraci členství ASP.NET 2.0 a dalších poskytovatelů.
Souhrn
V tomto okamžiku máme databázi s nakonfigurovanými aplikačními službami (SecurityTutorials.mdf
) a webovou aplikaci jsme nakonfigurovali tak, aby architektura členství používala SecurityTutorialsSqlMembershipProvider
poskytovatele, kterého jsme právě zaregistrovali. Tento registrovaný zprostředkovatel je typu SqlMembershipProvider
a je connectionStringName
nastavený na odpovídající připojovací řetězec (SecurityTutorialsConnectionString
) a jeho applicationName
hodnota je explicitně nastavena.
Nyní jsme připraveni použít architekturu členství z naší aplikace. V dalším kurzu prozkoumáme, jak vytvořit nové uživatelské účty. Dále prozkoumáme ověřování uživatelů, autorizaci na základě uživatelů a ukládání dalších informací souvisejících s uživateli v databázi.
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í:
- Vlastnost vždy nastavte
applicationName
při konfiguraci členství ASP.NET 2.0 a dalších zprostředkovatelů - Konfigurace aplikačních služeb ASP.NET 2.0 pro použití SQL Server 2000 nebo SQL Server 2005
- Stažení aplikace SQL Server Management Studio
- Zkoumání členství, rolí a profilu ASP.NET 2.0s
- Element
<add>
pro zprostředkovatele pro členství - The
<membership>
Element - Element
<providers>
pro členství - Použití při
<clear />
přidávání poskytovatelů - Práce přímo s
SqlMembershipProvider
Instruktážní video k tématům obsaženým v tomto kurzu
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. Hlavní revidující pro tento kurz byla Alicja Maziarz. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi řádek na mitchell@4GuysFromRolla.com.