Vytvoření schématu členství v SQL Serveru (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
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řena v jedné databázi, se snadněji rozumí, udržuje a nasazuje, 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é. Potom spusťte SQL Server Management Studio a připojte se k localhost\InstanceName
databázi pro SQL Server 2005 Express Edition. Jak jsme si poznamenali dříve, je pravděpodobné, že název instance je SQLExpress
. Jako možnost 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 musíme databázi 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 znázorňuje 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 Databases (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, aby se 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
, v uvedeném pořadí. 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. Zadejte %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe
do textového pole a klikněte na OK. Případně můžete pomocí Průzkumníka Windows přejít k podrobnostem 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 zobrazená 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 nás zeptá, jestli chceme přidat aplikační služby, nebo je odebrat. Vzhledem k tomu, že chceme přidat tabulky, zobrazení a uložené procedury potřebné 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: Zvolte možnost Konfigurovat SQL Server pro aplikační služby (kliknutím zobrazíte obrázek v plné velikosti)
Třetí krok zobrazí výzvu k zadání informací o databázi: název serveru, ověřovací informace a název databáze. Pokud jste postupovali společně s tímto kurzem a přidali SecurityTutorials.mdf
jste databázi do App_Data
, připojili ji k localhost\InstanceName
a přejmenovali 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é se budou provádět. Kliknutím na Další nainstalujte aplikační služby a pak dokončete průvodce kliknutím na Tlačítko Dokončit.
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 před opětovně otevřením sady Visual Studio. Pokud chcete databázi odpojit SecurityTutorialsDatabase
, klikněte pravým tlačítkem myši 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ěla by se zobrazit řada tabulek, jejichž názvy začínají předponou aspnet_
. Podobně můžete ve složkách Zobrazení a Uložené procedury najít celou řadu zobrazení a uložených procedur. 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, jaké konkrétní komponenty aplikačních služeb se mají nainstalovat (nebo odebrat). Pokud tedy chcete přidat jenom tabulky, zobrazení a uložené procedury potřebné pro SqlMembershipProvider
zprostředkovatele a SqlRoleProvider
, spusťte aspnet_regsql.exe
příkaz z příkazového řádku. Případně můžete ručně spustit příslušnou podmnožinu skriptů vytváření T-SQL, které aspnet_regsql.exe
používá . Tyto skripty jsou umístěné ve WINDIR%\Microsoft.Net\Framework\v2.0.50727\
složce s názvy, jako jsou InstallCommon.sql
,InstallMembership.sql
InstallRoles.sql
, InstallProfile.sql
, aInstallSqlState.sql
tak dále.
V tomto okamžiku jsme vytvořili databázové objekty, které SqlMembershipProvider
potřebuje . Přesto ale musíme dát architektuře členství pokyn, ActiveDirectoryMembershipProvider
aby používala SqlMembershipProvider
(oproti ) a aby SqlMembershipProvider
používala SecurityTutorials
databázi. V kroku 4 se podíváme na to, jak určit, jakého poskytovatele použít a jak přizpůsobit nastavení vybraného poskytovatele. Nejprve se ale podrobněji podíváme na právě vytvořené databázové objekty.
Krok 3: Podívejte se na základní tabulky schématu
Při práci s rozhraními Č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žívání těchto rozhraní API vysoké úrovně se nemusíme zabývat podrobnostmi nízké úrovně, jako jsou jaké dotazy se spouští nebo jaké tabulky jsou změněny pomocí SqlMembershipProvider
a SqlRoleProvider
.
Vzhledem k tomu bychom mohli bez obav používat rozhraní Č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. Pomáhá znát schémata a SqlRoleProvider
při vytváření omezení cizího klíče mezi tabulkami SqlMembershipProvider
dat aplikace a tabulkami vytvořenými v kroku 2. Kromě toho za určitých výjimečných okolností může být nutné, abychom se s úložištěm rolí a uživatelem mohli připojit 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í
Rozhraní Členství a Role jsou navržena tak, aby bylo možné sdílet jednoho uživatele a úložiště rolí mezi mnoha různými aplikacemi. ASP.NET aplikace, která používá rozhraní Členství nebo Role, musí určit, 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živatelů a rolí. 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 uživatelských účtech a rolích do stejných databázových tabulek.
Obrázek 11: Uživatelské účty můžou 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ý název, který je vhodný pro člověka.
Ostatní tabulky související s členstvím a rolemi odkazují zpět na pole v aspnet_Applications
nástroji ApplicationId
. 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 umístěny 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
prováže uživatelský účet s konkrétní aplikací v nástroji aspnet_Applications
. 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í poskytovatel č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ě aplikace AspNetSqlMembershipProvider
mohou být další poskytovatelé č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 systému je výchozí registrovaný zprostředkovatel machine.config
role a zaregistrovaní zprostředkovatelé se můžou přizpůsobit podle aplikace v Web.config
nástroji . Architekturu rolí a její konfigurační značky podrobně prozkoumáme v dalším kurzu.
PřizpůsobeníSqlMembershipProvider
nastavení
Výchozí SqlMembershipProvider
(AspNetSqlMembershipProvider
) má atribut connectionStringName
nastavený na LocalSqlServer
. Stejně jako u AspNetSqlMembershipProvider
poskytovatele 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, tato připojovací řetězec definuje databázi SQL 2005 Express Edition umístěnou na adrese |DataDirectory|aspnetdb.mdf'. Řetězec |Datový adresář| se za běhu přeloží tak, aby odkazovat na ~/App_Data/
adresář, takže cesta k databázi |DataDirectory|aspnetdb.mdf" se překládá na ~/App_Data
/aspnet.mdf
.
Pokud jsme v souboru naší 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žívat aspnet.mdf
databázi, ale chceme použít SecurityTutorials.mdf
databázi, 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 nechat hoSecurityTutorials.mdf
správně pracovat s databází. Tento přístup je v pořádku, pokud se spokojíte s nastavením konfigurace zadaným nástrojemAspNetSqlMembershipProvider
. 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
SqlMembershipProvider
a nakonfigurujte jehoconnectionStringName
nastavení, které má odkazovat naSecurityTutorials.mdf
Databáze. Tento přístup je užitečný ve scénářích, ve kterých chcete kromě připojovací řetězec databáze 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ázvemSecurityTutorialsConnectionString
, 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 ConnectionStrings.com.
Dále do Web.config
souboru přidejte následující kód konfigurace členství. Tato značka 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á značka SecurityTutorialsSqlMembershipProvider
jako výchozího zprostředkovatele (prostřednictvím atributu defaultProvider
v elementu <membership>
). Vzpomeňte si, že rozhraní členství může mít více registrovaných poskytovatelů. Vzhledem k tomu AspNetSqlMembershipProvider
, že je zaregistrovaný jako první poskytovatel v machine.config
, slouží jako výchozí poskytovatel, pokud neurčíme jinak.
V současné době má naše aplikace dva registrované poskytovatele: AspNetSqlMembershipProvider
a SecurityTutorialsSqlMembershipProvider
. Před registrací SecurityTutorialsSqlMembershipProvider
zprostředkovatele jsme však mohli vymazat všechny dříve zaregistrované poskytovatele přidáním <clear />
prvku bezprostředně před náš <add>
prvek. Tím by se vymazal AspNetSqlMembershipProvider
seznam registrovaných poskytovatelů, což znamená, že SecurityTutorialsSqlMembershipProvider
by byl jediným registrovaným poskytovatelem č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ý poskytovatel č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 shodné s hodnotami v AspNetSqlMembershipProvider
souboru . Pokud chcete, můžete zde provést jakékoli změny konfigurace. Sílu hesla můžete například zpřísnit vyžadováním dvou nealnumerický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í označuje, jakou aplikaci zprostředkovatel používá při práci s úložištěm uživatelů. Je důležité explicitně nastavit hodnotu pro applicationName
nastavení konfigurace, protože pokud applicationName
není explicitně nastavená, je přiřazena k virtuální kořenové cestě webové aplikace za běhu. Funguje to bez problémů, pokud se nezmění virtuální kořenová cesta aplikace, ale pokud aplikaci přesunete na jinou cestu, applicationName
změní se i nastavení. Když k tomu dojde, poskytovatel č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řihlašovat. 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 nakonfigurovali jsme naši webovou aplikaci tak, aby architektura členství používala SecurityTutorialsSqlMembershipProvider
zprostředkovatele, kterého jsme právě zaregistrovali. Tento registrovaný zprostředkovatel je typu SqlMembershipProvider
a má connectionStringName
nastavenou odpovídající připojovací řetězec (SecurityTutorialsConnectionString
) a jeho applicationName
hodnotu explicitně nastavenou.
Teď jsme připraveni použít rozhraní členství z naší aplikace. V dalším kurzu se podíváme, jak vytvořit nové uživatelské účty. Potom 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 do databáze.
Šťastné programování!
Další čtení
Další informace o tématech probíraných v tomto kurzu najdete v následujících zdrojích informací:
- Vždy nastavit
applicationName
vlastnost při konfiguraci členství ASP.NET 2.0 a dalších zprostředkovatelů - Konfigurace ASP.NET 2.0 Application Services 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.0
- Element
<add>
pro zprostředkovatele pro členství - The
<membership>
Element - Element
<providers>
pro členství - Použití
<clear />
při přidávání zprostředkovatelů - Práce přímo s
SqlMembershipProvider
Videotrénování 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 mitchell@4guysfromrolla.com nebo prostřednictvím jeho blogu na http://ScottOnWriting.NETadrese .
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. Chcete si projít moje nadcházející články na WEBU MSDN? Pokud ano, dejte mi čáru na mitchell@4GuysFromRolla.comadresu .