Sdílet prostřednictvím


Vytvoření schématu členství v SQL Serveru (VB)

Scott Mitchell

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ží GenericPrincipalFormsIdentity 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.

Přidání nové databáze SQL Database s názvem SecurityTutorials.mdf do složky App_Data

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.

Databáze SecurityTutorials je aktuálně prázdná.

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ématuSqlMembershipProviderdo 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ě SqlRoleProviderse 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_Dataslož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 SQLExpresss 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.

Připojení k instanci SQL Server 2005 Express Edition

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.

Připojení SecurityTutorials.mdf Database

Obrázek 4: Připojení SecurityTutorials.mdf databáze (kliknutím zobrazíte obrázek v plné velikosti)

Databáze SecurityTutorials.mdf se zobrazí ve složce Databáze.

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.

Přejmenujte databázi na SecurityTutorialsDatabase.

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.

Přidání schématu členství pomocí průvodce instalací ASP.NET SQL Server

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.

Zvolte možnost Konfigurovat SQL Server pro aplikační služby.

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\InstanceNamea přejmenovali ji na SecurityTutorialsDatabase, použijte následující hodnoty:

  • Server: localhost\InstanceName
  • Ověřování systému Windows
  • Databáze: SecurityTutorialsDatabase

Zadejte informace o databázi.

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.

Do databáze byly přidány různé tabulky, zobrazení a uložené procedury.

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.exespustit 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.sqlatd.

V tomto okamžiku jsme vytvořili databázové objekty, které SqlMembershipProviderpotřebuje . Přesto ale musíme platformě členství dát pokyn, aby používala SqlMembershipProvider (oproti ) ActiveDirectoryMembershipProvidera 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í SqlMembershipProviderSqlRoleProvider.

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 SqlMembershipProviderSqlRoleProvider 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.

Uživatelské účty můžou být rozdělené do více aplikací.

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, LoweredApplicationNamea 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_Applicationsná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, PasswordFormata 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_Applicationsná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 MembershipProviders 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 SqlMembershipProvider2.

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á SqlMembershipProvidernastavení 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, Hashednebo 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 AspNetSqlMembershipProvidermohou 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.confignástroji . Architekturu Rolí a její konfigurační značky prozkoumáme podrobně v dalším kurzu.

PřizpůsobeníSqlMembershipProvidernastavení

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.configsouboru .

<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 proLocalSqlServerpřipojovací řetězec název.Web.config Přepsáním LocalSqlServer hodnoty názvu připojovací řetězec v Web.configsouboru můžeme použít výchozího registrovaného zprostředkovatele členství (AspNetSqlMembershipProvider) a správně pracovat s SecurityTutorials.mdf databází. Tento přístup je v pořádku, pokud se spokojíte s nastavením konfigurace zadaným v AspNetSqlMembershipProvider. 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 typuSqlMembershipProvidera nakonfigurujte jehoconnectionStringNamenastavení pro odkaz naSecurityTutorials.mdfDatabá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.configsouboru . 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.configná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 SecurityTutorialsSqlMembershipProviderconnectionStringName 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í:

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.