Sdílet prostřednictvím


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.

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

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.

databáze SecurityTutorials je aktuálně prázdná

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

Připojení k instanci SQL Serveru 2005 Express Edition

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.

připojit databázi SecurityTutorials.mdf

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

se databáze SecurityTutorials.mdf 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, 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.

přejmenovat databázi na SecurityTutorialsDatabase

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.

Použijte Průvodce instalací SQL Serveru ASP.NET k přidání schématu členství

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.

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 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\InstanceNamea přejmenovali ji na SecurityTutorialsDatabasea pak 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 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.

do databáze 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.sqlatd.

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.

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

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, LoweredApplicationNamea 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 a existuje složené omezení. Tím zajistíte, že v dané aplikaci bude každý userName 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 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, PasswordFormata 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 SqlMembershipProvidernajdete 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 SqlMembershipProviderspolu 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, Hashednebo 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ě AspNetSqlMembershipProvidermohou 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ězceLocalSqlServervWeb.config. Přepsáním hodnoty názvu připojovacího řetězce LocalSqlServer v Web.configmůž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ým AspNetSqlMembershipProvider. 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 typuSqlMembershipProvidera konfigurace nastaveníconnectionStringNametak, 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 SecurityTutorialsSqlMembershipProviderodkazuje 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í:

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