Vytvoření schématu členství na SQL Serveru (C#)
podle Scott Mitchell
Poznámka
Od doby, kdy byl tento článek napsán, byly poskytovatelé členství ASP.NET nahrazeni ASP.NET Identity. Důrazně doporučujeme aktualizovat aplikace tak, aby používaly platformu ASP.NET Identity místo poskytovatelů členství doporučených v době psaní tohoto článku. ASP.NET Identity má řadu výhod oproti systému členství ASP.NET, včetně:
- 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ích
- Lepší interoperabilita s ASP.Net Core
stáhnout kód nebo stáhnout PDF
Tento kurz začíná zkoumáním technik pro přidání potřebného schématu do databáze, aby bylo možné použít SqlMembershipProvider. Za tímto účelem prozkoumáme klíčové tabulky ve schématu a probereme jejich účel a důležitost. Tento kurz končí pohledem na to, jak aplikaci ASP.NET sdělit, kterého poskytovatele by měl framework Membership používat.
Úvod
Předchozí dva kurzy se zabývaly použitím ověřování formulářů k identifikaci návštěvníků webu. Architektura ověřování pomocí formulářů usnadňuje vývojářům přihlášení uživatele na web a jejich zapamatování na stránkách prostřednictvím lístků ověřování. Třída FormsAuthentication
obsahuje metody pro generování lístku a jeho přidání do souborů cookie návštěvníka.
FormsAuthenticationModule
zkontroluje všechny příchozí požadavky a pro ty, které mají platný autentizační lístek, vytvoří a přidruží objekt GenericPrincipal
a FormsIdentity
k aktuálnímu požadavku. Ověřování pomocí formulářů je pouze mechanismus pro udělení ověřovacího lístku návštěvníkovi při přihlašování a při následných požadavcích rozbor tohoto ověřovacího lístku za účelem určení identity uživatele. Aby webová aplikace podporovala uživatelské účty, musíme implementovat úložiště uživatelů a přidat funkce pro ověření přihlašovacích údajů, registraci nových uživatelů a řadu dalších úloh souvisejících s uživatelskými účty.
Před ASP.NET 2.0 byli vývojáři zodpovědní za implementaci všech těchto úloh souvisejících s uživatelskými účty. Naštěstí tým ASP.NET tento nedostatek rozpoznal a představil 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 postavena na základě modelu poskytovatele , který vývojářům umožňuje připojit přizpůsobenou implementaci do standardizovaného rozhraní API.
Jak je popsáno v kurzu základy zabezpečení a ASP.NET podpora, rozhraní .NET Framework se dodává se dvěma integrovanými poskytovateli členství: ActiveDirectoryMembershipProvider
a SqlMembershipProvider
. Jak už název napovídá, SqlMembershipProvider
jako úložiště uživatelů používá databázi Microsoft SQL Serveru. Abychom mohli tohoto poskytovatele použít v aplikaci, musíme poskytovateli sdělit, jakou databázi má používat jako úložiště. Jak si můžete představit, SqlMembershipProvider
očekává, že databáze úložiště uživatelů bude mít určité databázové tabulky, zobrazení a uložené procedury. Do vybrané databáze musíme přidat toto očekávané schéma.
Tento kurz začíná zkoumáním technik pro přidání potřebného schématu do databáze, aby bylo možné použít SqlMembershipProvider
. Za tímto účelem prozkoumáme klíčové tabulky ve schématu a probereme jejich účel a důležitost. V tomto kurzu se dozvíte, jak říct aplikaci ASP.NET, kterého zprostředkovatele by měla architektura členství používat.
Pojďme začít!
Krok 1: Rozhodnutí o umístění úložiště uživatelů
Data ASP.NET aplikace se běžně ukládají v řadě tabulek v databázi. Při implementaci schématu databáze SqlMembershipProvider
se musíme rozhodnout, zda se schéma členství umístí do stejné databáze jako data aplikace nebo do alternativní databáze.
Doporučujeme vyhledat schéma členství ve stejné databázi jako data aplikace z následujících důvodů:
- udržovatelnost aplikace, jejíž data jsou zapouzdřena v jedné databázi, snadněji pochopit, udržovat a nasadit než aplikace, která má dvě samostatné databáze.
- relační integrita ' vyhledáním tabulek souvisejících s členstvím ve stejné databázi jako tabulky aplikací je možné stanovit omezení cizího klíče mezi primárními klíči v tabulkách souvisejících s členstvím a souvisejícími tabulkami aplikací.
Oddělení úložiště uživatelů a dat aplikací do samostatných databází dává 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á vytváříme od druhého kurzu, ještě nepotřebovala databázi. Potřebujeme ho ale pro úložiště uživatelů. Vytvoříme ho a pak ho přidáme do schématu požadovaného poskytovatelem SqlMembershipProvider
(viz krok 2).
Poznámka
V této sérii kurzů budeme používat databázi Microsoft SQL Server 2005 Express Edition k ukládání tabulek aplikací a schématu SqlMembershipProvider
. Toto rozhodnutí bylo provedeno ze dvou důvodů: nejprve z důvodu jeho nákladů - zdarma - Express Edition je nejčtenější verze SQL Serveru 2005; za druhé, databáze SQL Server 2005 Express Edition lze umístit přímo do složky App_Data
webové aplikace, což z něj dělá cinch zabalit databázi a webovou aplikaci do jednoho souboru ZIP a znovu ji nasadit bez jakýchkoli zvláštních pokynů k nastavení nebo možnosti konfigurace. Pokud preferujete sledovat verzi SQL Serveru, která není Express Edition, klidně to udělejte. Kroky jsou prakticky identické. Schéma SqlMembershipProvider
bude fungovat s libovolnou verzí microsoft SQL Serveru 2000 a novější.
V Průzkumníku řešení klikněte pravým tlačítkem na složku App_Data
a zvolte přidat novou položku. (Pokud v projektu nevidíte složku App_Data
, klikněte pravým tlačítkem na projekt v Průzkumníku řešení, vyberte Přidat ASP.NET Složku a vyberte App_Data
.) V dialogovém okně Přidat novou položku zvolte, jestli chcete přidat novou databázi SQL s názvem SecurityTutorials.mdf
. V tomto kurzu přidáme do této databáze schéma SqlMembershipProvider
; v dalších kurzech vytvoříme další tabulky pro zachycení dat aplikace.
obrázek 1: Přidání nové databáze SQL s názvem SecurityTutorials.mdf
Database do složky App_Data
(Kliknutím zobrazíte obrázek v plné velikosti)
Přidání databáze do složky App_Data
ji automaticky zahrne do zobrazení Průzkumníka databáze. (Ve verzi sady Visual Studio, která není edicí Express Edition, se Průzkumník databáze nazývá Průzkumník serveru.) Přejděte do Průzkumníka databáze a rozbalte právě přidanou databázi SecurityTutorials
. Pokud průzkumníka databáze nevidíte na obrazovce, přejděte do nabídky Zobrazení a zvolte Průzkumníka databáze nebo stiskněte Kombinaci kláves Ctrl+Alt+S. Jak ukazuje obrázek 2, databáze SecurityTutorials
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íteobrázku v plné velikosti).
Krok 2: Přidání schématuSqlMembershipProvider
do databáze
SqlMembershipProvider
vyžaduje, 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í nástroje aspnet_regsql.exe
. Tento soubor se nachází ve složce %WINDIR%\Microsoft.Net\Framework\v2.0.50727\
.
Poznámka
Nástroj aspnet_regsql.exe
nabízí funkce příkazového řádku i grafické uživatelské rozhraní. Grafické rozhraní je uživatelsky přívětivější a je to to, co budeme zkoumat v tomto kurzu. Rozhraní příkazového řádku je užitečné, když je potřeba automatizovat přidání schématu SqlMembershipProvider
, 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 Serveru. Aplikační služby ASP.NET zahrnují schémata pro SqlMembershipProvider
a SqlRoleProvider
spolu se schématy pro poskytovatele založené na SQL pro jiné architektury ASP.NET 2.0. Potřebujeme poskytnout aspnet_regsql.exe
nástroji dvě části informací:
- Ať už chceme přidat nebo odebrat aplikační služby,
- Databáze, ze které chcete 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 aspnet_regsql.exe
požádá, abychom zadali název serveru, na kterém se databáze nachází, přihlašovací údaje zabezpečení pro připojení k databázi a název databáze. Pokud používáte verzi SQL Serveru, která není Express Edition, měli byste už tyto informace znát, protože se jedná o stejné informace, které musíte poskytnout prostřednictvím připojovacího řetězce 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í databáze SQL Server 2005 Express Edition ve složce App_Data
je však trochu více zapojeno.
Následující část popisuje jednoduchý způsob zadávání názvu serveru a databáze pro databázi SQL Server 2005 Express Edition ve složce App_Data
. Pokud sql Server 2005 Express Edition nepoužíváte, můžete přejít k části Instalace aplikačních služeb.
Určení názvu serveru a databáze pro databázi SQL Serveru 2005 Express Edition ve složceApp_Data
Abychom mohli použít nástroj aspnet_regsql.exe
, potřebujeme znát názvy serverů a databází. Název serveru je localhost\InstanceName
. S největší pravděpodobností je InstanceNameSQLExpress
. Pokud jste ale sql Server 2005 Express Edition nainstalovali ručně (to znamená, že jste ho při instalaci sady Visual Studio nenainstalovali automaticky), je možné, že jste vybrali jiný název instance.
Název databáze je trochu složitější k určení. Databáze ve složce App_Data
mají obvykle název databáze, který obsahuje globálně jedinečný identifikátor spolu s cestou k souboru databáze. Potřebujeme určit tento název databáze, aby bylo možné 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 aplikace SQL Server Management Studio. SQL Server Management Studio poskytuje grafické rozhraní pro správu databází SQL Serveru 2005, ale není součástí edice Express SQL Serveru 2005. Dobrou zprávou je, že si můžete stáhnout bezplatnou edici Express Edition aplikace SQL Server Management Studio.
Poznámka
Pokud máte na počítači nainstalovanou i verzi SQL Serveru 2005, která není express Edition, pravděpodobně se nainstaluje úplná verze sady Management Studio. Úplnou verzi můžete použít k určení názvu databáze, a to podle stejných kroků, které jsou popsány níže pro edici Express Edition.
Začněte zavřením sady Visual Studio, abyste zajistili, že všechny zámky uložené sadou Visual Studio v databázovém souboru jsou zavřené. Dále spusťte aplikaci SQL Server Management Studio a připojte se k databázi localhost\InstanceName
pro 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 edice SQL Server 2005 Express (Kliknutím zobrazíte obrázek s plnou velikostí)
Po připojení k instanci SQL Server 2005 Express Edition management Studio zobrazí složky pro databáze, nastavení zabezpečení, objekty serveru atd. Pokud rozbalíte kartu Databáze, uvidíte, že databáze SecurityTutorials.mdf
není zaregistrována v instanci databáze – napřed potřebujeme databázi připojit.
Klikněte pravým tlačítkem na složku Databáze a v místní nabídce zvolte Připojit. Zobrazí se dialogové okno Připojit databáze. Tady klikněte na tlačítko Přidat, přejděte do databáze SecurityTutorials.mdf
a klikněte na TLAČÍTKO OK. Obrázek 4 znázorňuje dialogové okno Připojit databáze po výběru SecurityTutorials.mdf
databáze. Obrázek 5 ukazuje Průzkumníka objektů v Management Studiu po úspěšném připojení databáze.
obrázek 4: Připojení databáze SecurityTutorials.mdf
(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, databáze SecurityTutorials.mdf
má poměrně abstrusní název. Pojďme ho změnit na zapamatovatější (a snadněji psát) název. Klikněte pravým tlačítkem myši na databázi, v místní nabídce zvolte Přejmenovat a přejmenujte ji SecurityTutorialsDatabase
. Název souboru se nezmění, pouze název, který databáze používá k identifikaci samotného sql Serveru.
obrázek 6: Přejmenování databáze na SecurityTutorialsDatabase
(Kliknutím zobrazíte obrázek v plné velikosti)
V tuto chvíli známe názvy serverů a databází pro soubor databáze SecurityTutorials.mdf
: localhost\InstanceName
a SecurityTutorialsDatabase
. Nyní jsme připraveni nainstalovat aplikační služby prostřednictvím nástroje aspnet_regsql.exe
.
Instalace aplikačních služeb
Pokud chcete spustit nástroj aspnet_regsql.exe
, přejděte do nabídky Start a zvolte Spustit. Do textového pole zadejte %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe
a klikněte na TLAČÍTKO OK. Případně můžete pomocí Průzkumníka Windows přejít k podrobnostem příslušné složky a poklikejte na soubor aspnet_regsql.exe
. Oba přístupy přinesou 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 SYSTÉMU SQL Server. Průvodce usnadňuje přidávání nebo odebírá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: Pomocí průvodce instalací ASP.NET SQL Serveru přidáte schéma členství (Kliknutím zobrazíteobrázku v plné velikosti).
Druhý krok v průvodci 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 chcete toto schéma z databáze odebrat, znovu spusťte tohoto průvodce, ale místo toho zvolte možnost Odebrat informace aplikačních služeb 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 vyzve 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 jste databázi SecurityTutorials.mdf
do App_Data
, připojili ji k localhost\InstanceName
a přejmenovali ji na SecurityTutorialsDatabase
a pak 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 klepněte na tlačítko Další. Poslední krok shrnuje kroky, které se mají provést. Chcete-li nainstalovat aplikační služby, klepněte na tlačítko Další a dokončete průvodce.
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. Chcete-li odpojit SecurityTutorialsDatabase
databázi, klikněte pravým tlačítkem myši na název databáze a v nabídce Úkoly 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ě lze různé zobrazení a uložené procedury najít ve složkách 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 role.
byla přidána řada tabulek, zobrazení a uložených procedur.
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é uživatelské rozhraní nástroje aspnet_regsql.exe
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í součásti aplikačních služeb se mají nainstalovat (nebo odebrat). Proto pokud chcete přidat pouze tabulky, zobrazení a uložené procedury potřebné pro poskytovatele SqlMembershipProvider
a SqlRoleProvider
, spusťte aspnet_regsql.exe
z příkazového řádku. Alternativně můžete ručně spustit příslušnou podmnožinu T-SQL vytvořit skripty používané aspnet_regsql.exe
. Tyto skripty se nacházejí ve složce WINDIR%\Microsoft.Net\Framework\v2.0.50727\
s názvy, jako jsou InstallCommon.sql
,InstallMembership.sql
,InstallRoles.sql
, InstallProfile.sql
,InstallSqlState.sql
atd.
V tuto chvíli jsme vytvořili databázové objekty potřebné pro SqlMembershipProvider
. Stále však potřebujeme instruovat systém členství, aby používal SqlMembershipProvider
(na rozdíl od ActiveDirectoryMembershipProvider
) a že SqlMembershipProvider
by měla použít databázi SecurityTutorials
. Podíváme se, jak určit, jakého zprostředkovatele použít, a jak přizpůsobit nastavení vybraného poskytovatele v kroku 4. Nejprve se ale podrobněji podíváme na databázové objekty, které byly právě vytvořeny.
Krok 3: Podívejte se na základní tabulky schématu
Při práci s architekturami členství a rolí v aplikaci ASP.NET jsou podrobnosti implementace zapouzdřeny poskytovatelem. V budoucích kurzech budeme s těmito architekturami spolupracovat prostřednictvím tříd Membership
a Roles
rozhraní .NET Framework. Při použití vysokoúrovňových rozhraní API se nemusíme zabývat podrobnostmi nízké úrovně, jako jsou které dotazy jsou spuštěny nebo které tabulky jsou upraveny pomocí SqlMembershipProvider
a SqlRoleProvider
.
Vzhledem k tomu bychom mohli s jistotou používat architektury členství a rolí bez prozkoumání schématu databáze vytvořeného v kroku 2. Při vytváření tabulek pro ukládání dat aplikací ale možná budeme muset vytvořit entity, které se vztahují k uživatelům nebo rolím. Pomáhá seznámit se se schématy SqlMembershipProvider
a SqlRoleProvider
při vytváření omezení cizího klíče mezi tabulkami dat aplikace a těmito tabulkami vytvořenými v kroku 2. V některých výjimečných případech navíc můžeme potřebovat rozhraní s úložištěm uživatelů a rolí přímo na úrovni databáze (nikoli prostřednictvím Membership
nebo tříd Roles
).
Rozdělení úložiště uživatelů do aplikací
Architektury členství a rolí jsou navrženy tak, aby se jeden uživatel a úložiště rolí mohly sdílet mezi mnoha různými aplikacemi. Aplikace ASP.NET, která používá architektury Členství nebo Role, musí určovat, jaký oddíl aplikace se má použít. Stručně řečeno, několik 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í rozdělených do tří aplikací: HRSite, CustomerSite a SalesSite. Tyto tři webové aplikace mají své vlastní jedinečné uživatele a role, ale všechny fyzicky ukládají informace o svém uživatelském účtu 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).
Tabulka aspnet_Applications
definuje tyto oddíly. Každá aplikace, která používá databázi k ukládání informací o uživatelském účtu, je reprezentována řádkem v této tabulce. Tabulka aspnet_Applications
obsahuje čtyři sloupce: ApplicationId
, ApplicationName
, LoweredApplicationName
a Description
.
ApplicationId
je typu uniqueidentifier
a je primárním klíčem tabulky; ApplicationName
poskytuje pro každou aplikaci jedinečný uživatelsky přívětivý název.
Ostatní tabulky související s členstvím a rolemi odkazují zpět na pole ApplicationId
v aspnet_Applications
. Například tabulka aspnet_Users
, která obsahuje záznam pro každý uživatelský účet, má pole ApplicationId
cizího klíče; ditto pro aspnet_Roles
tabulku. Pole ApplicationId
v těchto tabulkách určuje oddíl aplikace, do které uživatelský účet nebo role patří.
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 typ uniqueidentifier
).
UserName
je typu nvarchar(256)
a spolu s heslem tvoří přihlašovací údaje uživatele. (Heslo uživatele je uloženo v tabulce aspnet_Membership
.) ApplicationId
propojit uživatelský účet s konkrétní aplikací v aspnet_Applications
. Ve sloupcích UserName
v různých aplikacích.
Tabulka aspnet_Membership
obsahuje další informace o uživatelském účtu, jako jsou heslo uživatele, e-mailová adresa, datum a čas posledního přihlášení atd. Mezi záznamy v tabulkách aspnet_Users
a aspnet_Membership
existuje korespondence 1:1. Tuto relaci zajišťuje pole UserId
v aspnet_Membership
, které slouží jako primární klíč tabulky. Podobně jako aspnet_Users
tabulka obsahuje aspnet_Membership
pole ApplicationId
, které tyto informace prováže s konkrétním oddílem aplikace.
Zabezpečení hesel
Informace o heslech jsou uloženy v tabulce aspnet_Membership
.
SqlMembershipProvider
umožňuje ukládání hesel do databáze pomocí jedné z následujících tří technik:
- Vymazat – heslo je uložené v databázi jako prostý text. Důrazně nedoporučujem tuto možnost používat. Pokud dojde k ohrožení zabezpečení databáze – ať už hackerem, který najde zadní dveře nebo nespokojený zaměstnanec, který má přístup k databázi – přihlašovací údaje každého jednoho uživatele jsou k dispozici pro převzetí.
- hašované – hesla se hašují pomocí jednosměrného hašovacího algoritmu a náhodně generované soli. Tato hašovaná hodnota (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í SqlMembershipProvider
zadaných v Web.config
. Podíváme se na přizpůsobení nastavení 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 hashované; 2 pro šifrované.
PasswordSalt
je přiřazen náhodně vygenerovaný řetězec bez ohledu na použitou techniku úložiště hesel; hodnota PasswordSalt
se používá pouze při výpočtu hodnoty hash hesla. Nakonec sloupec Password
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 tyto tři sloupce můžou vypadat pro různé techniky úložiště při ukládání hesla MySecret. .
Technika úložiště <_o3a_p /> | heslo<_o3a_p /> | PasswordFormat<_o3a_p /> | PasswordSalt<_o3a_p /> |
---|---|---|---|
Jasný | MySecret! | 0 | tTnkPlesqissc2y2SMEygA== |
Hashované | 2oXm6sZHWbTHFgjgkGQsc2Ec9ZM= | 1 | wFgjUfhdUFOCKQiI61vtiQ== |
Zakódovaný | 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUU3e7Inza9j9BKp | 2 | LSRzhGS/aa/oqAXGLHJNBw== |
tabulka 1: Příklad hodnot polí Password-Related při ukládání hesla MySecret!
Poznámka
Algoritmus šifrování nebo hašování používaný SqlMembershipProvider
je určen nastavením v prvku <machineKey>
.
Ukládání rolí a přidružení rolí
Architektura Role umožňuje vývojářům definovat sadu rolí a určit, kteří uživatelé patří k jakým rolím. Tyto informace jsou zaznamenány v databázi prostřednictvím dvou tabulek: aspnet_Roles
a aspnet_UsersInRoles
. Každý záznam v tabulce aspnet_Roles
představuje roli pro určitou aplikaci. Podobně jako aspnet_Users
tabulka má tabulka aspnet_Roles
tři sloupce, které jsou relevantní pro naši diskuzi:
RoleId
RoleName
ApplicationId
RoleId
je primární klíč (a typ uniqueidentifier
).
RoleName
je typu nvarchar(256)
. A ApplicationId
propojuje uživatelský účet s konkrétní aplikací v aspnet_Applications
. Ve sloupcích RoleName
a ApplicationId
existuje složené UNIQUE
omezení, které zajistí, aby v dané aplikaci byl každý název role jedinečný.
Tabulka aspnet_UsersInRoles
slouží jako mapování mezi uživateli a rolemi. Existují jenom dva sloupce – UserId
a RoleId
– a společně tvoří složený primární klíč.
Krok 4: Určení zprostředkovatele a přizpůsobení jeho nastavení
Všechny architektury, které podporují model poskytovatele , jako jsou architektury členství a role, nemají podrobnosti implementace samotné a místo toho tuto odpovědnost delegují na třídu zprostředkovatele. V případě rozhraní Membership Framework definuje třída Membership
rozhraní API pro správu uživatelských účtů, ale nepracuje přímo s žádným úložištěm uživatelů. Spíše metody třídy Membership
předávají požadavek nakonfigurovanému poskytovateli – budeme používat SqlMembershipProvider
. Když použijeme jednu z metod ve třídě Membership
, jak rozhraní Membership pozná, že má delegovat volání na SqlMembershipProvider
?
Třída Membership
má vlastnost Providers
, která obsahuje odkaz na všechny registrované třídy poskytovatele dostupné pro využití Membership frameworkem. Každý registrovaný zprostředkovatel má přidružený název a typ. Název nabízí popisný způsob, jak odkazovat na konkrétního poskytovatele v kolekci Providers
, zatímco typ identifikuje třídu zprostředkovatele. Každý registrovaný zprostředkovatel může navíc obsahovat nastavení konfigurace. Nastavení konfigurace pro rámec členství zahrnuje mimo jiné passwordFormat
a requiresUniqueEmail
. Úplný seznam nastavení konfigurace používaných SqlMembershipProvider
najdete v tabulce 2.
Obsah vlastnosti Providers
se zadává 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
(umístěný v %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG)
:
Varování
Vypadá to, že ukázka, kterou hledáte, se někam přestěhovala! Ujišťujeme vás, že na vyřešení tohoto pracujeme.
Jak ukazuje výše uvedený kód, element <membership>
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í <add>
nebo <remove>
prvků; 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ě atributů name
a type
obsahuje element <add>
atributy, které definují hodnoty pro různá nastavení konfigurace. Tabulka 2 obsahuje seznam dostupných nastavení konfigurace specifických pro SqlMembershipProvider
spolu s popisem jednotlivých nastavení.
Poznámka
Všechny výchozí hodnoty uvedené v tabulce 2 odkazují na výchozí hodnoty definované ve třídě SqlMembershipProvider
. Všimněte si, že ne všechna nastavení konfigurace v AspNetSqlMembershipProvider
odpovídají výchozím hodnotám třídy SqlMembershipProvider
. Například pokud není specifikováno ve zprostředkovateli členství, nastavení requiresUniqueEmail
má výchozí hodnotu true.
AspNetSqlMembershipProvider
však tuto výchozí hodnotu přepíše explicitně 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í označuje název oddílu aplikace používaného poskytovatelem č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ího řetězce v elementu <connectionStrings> , který se má použít pro připojení k databázi úložiště uživatelů. Tato hodnota je povinná. |
description |
Poskytuje popis registrovaného poskytovatele, který je pro člověka přívětivý. |
enablePasswordRetrieval |
Určuje, jestli uživatelé můžou načíst zapomenuté heslo. Výchozí hodnota je false . |
enablePasswordReset |
Určuje, jestli mají uživatelé povoleno 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 dojít pro daného uživatele během zadaného passwordAttemptWindow před uzamčením uživatele. Výchozí hodnota je 5. |
minRequiredNonalphanumericCharacters |
Minimální počet nealnumerických znaků, které se musí zobrazit v hesle uživatele. Tato hodnota musí být v rozmezí od 0 do 128; výchozí hodnota je 1. |
minRequiredPasswordLength |
Minimální počet znaků požadovaných v hesle. Tato hodnota musí být v rozmezí od 0 do 128; výchozí hodnota je 7. |
name |
Název registrovaného poskytovatele. Tato hodnota je povinná. |
passwordAttemptWindow |
Počet minut, během kterých jsou sledovány neúspěšné pokusy o přihlášení. Pokud zadá uživatel neplatné přihlašovací údaje maxInvalidPasswordAttempts krát v tomto časovém okně, jeho účet bude uzamčen. Výchozí hodnota je 10. |
PasswordFormat |
Formát úložiště hesel: Clear , Hashed nebo Encrypted . Výchozí hodnota je Hashed . |
passwordStrengthRegularExpression |
V případě potřeby se tento regulární výraz používá k vyhodnocení síly vybraného hesla uživatele 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í odpovědět na bezpečnostní otázku při načítání nebo resetování hesla. 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 je povinná. |
Tabulka 2: Členství a nastavení konfigurace SqlMembershipProvider
Kromě AspNetSqlMembershipProvider
mohou být další poskytovatelé členství registrováni pro jednotlivé aplikace přidáním podobného značení do souboru Web.config
.
Poznámka
Architektura rolí funguje velmi stejným způsobem: v machine.config
existuje výchozí registrovaný zprostředkovatel rolí a zaregistrovaní zprostředkovatelé mohou být přizpůsobeni na základě aplikace v Web.config
. V dalším kurzu prozkoumáme architekturu rolí a její kód konfigurace.
Přizpůsobení nastaveníSqlMembershipProvider
Výchozí SqlMembershipProvider
(AspNetSqlMembershipProvider
) má atribut connectionStringName
nastavený na LocalSqlServer
. Podobně jako u poskytovatele AspNetSqlMembershipProvider
je název připojovacího řetězce definovaný LocalSqlServer
v machine.config
.
Varování
Zdá se, že ukázka, kterou hledáte, byla přesunuta. Ujišťujeme vás, že pracujeme na vyřešení tohoto problému.
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 |DataDirectory| je přeložen za běhu tak, aby odkazoval na adresář ~/App_Data/
, takže cesta k databázi |DataDirectory|"aspnetdb.mdf" se překládá na ~/App_Data
/aspnet.mdf
.
Pokud jsme v souboru Web.config
naší aplikace nezadali žádné informace o poskytovateli členství, použije aplikace výchozího registrovaného zprostředkovatele členství AspNetSqlMembershipProvider
. Pokud databáze ~/App_Data/aspnet.mdf
neexistuje, modul runtime ASP.NET ji automaticky vytvoří a přidá schéma aplikačních služeb. Nechceme ale používat databázi aspnet.mdf
; chceme použít 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 název připojovacího řetězce
LocalSqlServer
vWeb.config
. Přepsáním hodnoty názvu připojovacího řetězceLocalSqlServer
vWeb.config
můžeme použít výchozího registrovaného zprostředkovatele členství (AspNetSqlMembershipProvider
) a správně pracovat s databázíSecurityTutorials.mdf
. Tento přístup je v pořádku, pokud jste spokojeni s nastavením konfigurace určenýmAspNetSqlMembershipProvider
. Další informace o této technice naleznete v příspěvku na blogu Scott Guthrie, Konfigurace ASP.NET 2.0 aplikačních služeb pro použití systému SQL Server 2000 nebo SQL Server 2005. -
Přidání nového registrovaného zprostředkovatele typu
SqlMembershipProvider
a konfigurace nastaveníconnectionStringName
tak, aby odkazovala na databáziSecurityTutorials.mdf
. Tento přístup je užitečný ve scénářích, ve kterých chcete kromě připojovacího řetězce databáze přizpůsobit i další vlastnosti konfigurace. V mých vlastních projektech tento přístup vždy používám kvůli své flexibilitě a čitelnosti.
Než budeme moct přidat nového registrovaného zprostředkovatele, který odkazuje na SecurityTutorials.mdf
databázi, musíme nejprve přidat odpovídající hodnotu připojovacího řetězce v části <connectionStrings>
v Web.config
. 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 složce App_Data
.
Varování
Vypadá to, že ukázka, kterou hledáte, se přesunula. Buďte ujištěni, že pracujeme na řešení tohoto problému.
Poznámka
Pokud používáte alternativní databázový soubor, podle potřeby aktualizujte připojovací řetězec. Další informace o vytvoření správného připojovacího řetězce najdete v ConnectionStrings.com.
Dále do souboru Web.config
přidejte následující kód konfigurace členství. Tento kód zaregistruje nového zprostředkovatele s názvem SecurityTutorialsSqlMembershipProvider
.
Varování
Vypadá to, že vámi hledaná ukázka se přesunula! Ujišťujeme vás, že na řešení tohoto problému pracujeme.
Kromě registrace poskytovatele SecurityTutorialsSqlMembershipProvider
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, že AspNetSqlMembershipProvider
je zaregistrovaný jako první zprostředkovatel v machine.config
, slouží jako výchozí zprostředkovatel, pokud ho nebylo uvedeno jinak.
V současné době má naše aplikace dva registrované poskytovatele: AspNetSqlMembershipProvider
a SecurityTutorialsSqlMembershipProvider
. Před registrací poskytovatele SecurityTutorialsSqlMembershipProvider
jsme ale mohli vymazat všechny dříve registrované zprostředkovatele tak, že jsme přidali prvek <clear />
bezprostředně před element <add>
. To by vymazal AspNetSqlMembershipProvider
ze seznamu registrovaných poskytovatelů, což znamená, že SecurityTutorialsSqlMembershipProvider
by byl jediným registrovaným poskytovatelem členství. Pokud bychom tento přístup použili, nemuseli bychom SecurityTutorialsSqlMembershipProvider
označit jako výchozího poskytovatele, protože by to byl jediný registrovaný zprostředkovatel členství. Další informace o použití <clear />
naleznete v tématu Použití <clear />
při přidání zprostředkovatelů.
Všimněte si, že nastavení connectionStringName
u SecurityTutorialsSqlMembershipProvider
odkazuje na název připojovacího řetězce SecurityTutorialsConnectionString
, který byl právě přidán, a že jeho nastavení applicationName
je nastaveno na hodnotu SecurityTutorials. Kromě toho je nastavení requiresUniqueEmail
nastaveno na true
. Všechny ostatní možnosti konfigurace jsou identické s hodnotami v AspNetSqlMembershipProvider
. Pokud chcete, můžete zde provést jakékoli změny konfigurace. Sílu hesla můžete například utáhnout tak, že místo jednoho vyžadujete dva nealnumerické znaky nebo zvýšíte délku hesla na osm znaků místo sedmi znaků.
Poznámka
Vzpomeňte si, že architektura členství umožňuje rozdělit úložiště jednoho uživatele do více aplikací. Nastavení applicationName
zprostředkovatele členství označuje, jakou aplikaci poskytovatel používá při práci s úložištěm uživatelů. Je důležité explicitně nastavit hodnotu pro nastavení konfigurace applicationName
, protože pokud applicationName
není explicitně nastavená, přiřadí se k virtuální kořenové cestě webové aplikace za běhu. To funguje správně, pokud se virtuální kořenová cesta aplikace nezmění, ale pokud aplikaci přesunete na jinou cestu, nastavení applicationName
se také změní. 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řihlásit. Podrobnější informace o této záležitosti najdete v tématu Vždy nastavte vlastnost applicationName
při konfiguraci ASP.NET 2.0 Membership a dalších poskytovatelů.
Shrnutí
V tuto chvíli máme databázi s nakonfigurovanými aplikačními službami (SecurityTutorials.mdf
) a nakonfigurovali jsme naši webovou aplikaci tak, aby rozhraní Členství používalo poskytovatele SecurityTutorialsSqlMembershipProvider
, kterého jsme právě zaregistrovali. Tento registrovaný zprostředkovatel je typu SqlMembershipProvider
a má connectionStringName
nastavený na příslušný připojovací řetězec (SecurityTutorialsConnectionString
) a jeho applicationName
hodnotu explicitně nastavenou.
Nyní 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. Dále prozkoumáme ověřování uživatelů, provádění autorizace na základě uživatele a ukládání dalších informací souvisejících s uživatelem v databázi.
Šť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í:
-
při konfiguraci členství ASP.NET 2.0 a dalších poskytovatelů vždy nastavit vlastnost
applicationName
- Konfigurace aplikačních služeb ASP.NET 2.0 k použití SQL Server 2000 nebo SQL Server 2005
- Stažení aplikace SQL Server Management Studio
- Zkoumání členství, rolí a profilů v ASP.NET 2.0
-
prvek pro poskytovatele členství
<add>
-
elementu
<membership>
-
Prvek
<providers>
pro členství -
Použití
<clear />
při přidávání zprostředkovatelů -
Přímá spolupráce s
SqlMembershipProvider
Školicí video o tématech obsažených v tomto kurzu
O autorovi
Scott Mitchell, autor více knih ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracoval s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams Naučte se ASP.NET 2.0 za 24 Hodin. Scott je dostupný na mitchell@4guysfromrolla.com nebo prostřednictvím svého blogu na http://ScottOnWriting.NET.
Zvláštní díky
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Vedoucí recenzent pro tento kurz byl Alicja Maziarz. Chcete si projít nadcházející články MSDN? Pokud ano, napište mi zprávu na mitchell@4GuysFromRolla.com.