Sdílet prostřednictvím


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

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

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

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

Připojení databáze SecurityTutorials.mdf

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

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.

Přejmenování databáze 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, 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.

Přidání schématu členství pomocí průvodce nastavením 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 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.

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

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\InstanceNamea přejmenovali 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é 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.

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, 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.exepouží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.sqlInstallRoles.sql, InstallProfile.sql, aInstallSqlState.sql tak dále.

V tomto okamžiku jsme vytvořili databázové objekty, které SqlMembershipProviderpotřebuje . Přesto ale musíme dát architektuře členství pokyn, ActiveDirectoryMembershipProvideraby 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.

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

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

PřizpůsobeníSqlMembershipProvidernastavení

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.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, 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 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 nechat ho SecurityTutorials.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ástrojem AspNetSqlMembershipProvider. 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 typuSqlMembershipProvidera nakonfigurujte jehoconnectionStringNamenastavení, které má odkazovat naSecurityTutorials.mdfDatabá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.configsouboru . 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 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 shodné s hodnotami v AspNetSqlMembershipProvidersouboru . 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í:

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 .