Členství
od Microsoftu
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
ASP.NET Členství vychází z úspěchu modelu ověřování formulářů z ASP.NET 1.x. Ověřování ASP.NET Forms poskytuje pohodlný způsob, jak začlenit přihlašovací formulář do aplikace ASP.NET a ověřit uživatele v databázi nebo jiném úložišti dat.
ASP.NET Členství vychází z úspěchu modelu ověřování formulářů z ASP.NET 1.x. Ověřování ASP.NET Forms poskytuje pohodlný způsob, jak začlenit přihlašovací formulář do aplikace ASP.NET a ověřit uživatele v databázi nebo jiném úložišti dat. Členové třídy FormsAuthentication umožňují zpracování souborů cookie pro ověřování, kontrolu platného přihlášení, odhlášení uživatele atd. Implementace ověřování pomocí formulářů v aplikaci ASP.NET 1.x však může vyžadovat značné množství kódu.
Členství v ASP.NET 2.0 představuje zásadní pokrok oproti používání samotného ověřování pomocí formulářů. (Členství je nejrobuspodnější ve spojení s ověřováním pomocí formulářů, ale ověřování pomocí formulářů není povinné.) Jak brzy uvidíte, můžete pomocí ASP.NET Členství a ovládacích prvků přihlášení v ASP.NET 2.0 implementovat výkonný systém členství, aniž byste museli psát hodně kódu.
Implementace členství v ASP.NET 2.0
Členství se implementuje pomocí čtyř kroků. Mějte na paměti, že existuje mnoho dílčích kroků, které se týkají, a také volitelná konfigurace, kterou je možné implementovat. Tyto kroky mají znázornit celkový obraz konfigurace členství.
Vytvořte databázi členství (pokud se jako úložiště členství používá SQL Server).
Zadejte možnosti členství v konfiguračních souborech aplikací. (Členství je ve výchozím nastavení povolené.)
Určete typ úložiště členství, které chcete použít. Dostupné možnosti:
- Microsoft SQL Server (verze 7.0 nebo novější)
- Úložiště služby Active Directory
- Vlastní zprostředkovatel členství
Nakonfigurujte aplikaci pro ověřování ASP.NET Forms. Členství je opět navržené tak, aby využívalo výhod ověřování pomocí formulářů, ale ověřování pomocí formulářů není povinné.
Definujte uživatelské účty pro členství a v případě potřeby nakonfigurujte role.
Vytvoření databáze členství
Pokud jako úložiště členství používáte SQL Server 7.0 nebo novější, můžete ke konfiguraci databáze použít nástroj aspnet_regsql (dostupný nejsná snadněji z příkazového řádku sady Visual Studio .NET 2005). Nástroj aspnet_regsql lze použít jako nástroj příkazového řádku nebo prostřednictvím průvodce grafickým uživatelským rozhraním. Nejjednodušší způsob konfigurace databáze je metoda průvodce. K průvodci se dostanete jednoduše spuštěním následujícího příkazu:
aspnet_regsql W
Po spuštění příkazu se zobrazí Průvodce instalací ASP.NET SQL Server, jak je znázorněno níže.
Obrázek 1
Průvodce instalací ASP.NET SQL Server vytvoří web v instanci, kterou určíte v průvodci. ASP.NET ale použije připojovací řetězec v souboru machine.config pro připojení k databázi. Ve výchozím nastavení bude tento připojovací řetězec odkazovat na instanci SQL Server 2005, takže pokud používáte instanci SQL Server 2000 nebo SQL Server 7.0, budete muset upravit připojovací řetězec v souboru machine.config. Tento připojovací řetězec můžete najít tady:
<configuration>
<connectionStrings>
<add name="LocalSqlServer"
connectionString="data source=(local);
Integrated Security=SSPI;Initial Catalog=aspnetdb;"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
Pokud připojovací řetězec neupravíte, ASP.NET bohužel nezobrazí popisnou chybu. Bude si jen dál stěžovat, že jste databázi nevytvořili. Ve výše uvedeném případě jsem upravil(a) připojovací řetězec tak, aby odkazoval na místní instanci SQL Server 2000.
Zadání konfigurace a přidání uživatelů a rolí
Dalším krokem při konfiguraci členství je přidání potřebných informací do web.config souboru aplikace. V ASP.NET 1.x byla úprava souboru web.config někdy obtížná kvůli použití lowerCamelCase a nedostatku intellisense. Visual Studio .NET 2005 usnadňuje práci s intellisense pro konfigurační soubory, ale ASP.NET 2.0 jde o krok dál tím, že poskytuje webové rozhraní pro úpravy konfiguračních souborů.
Webové rozhraní můžete spustit kliknutím na tlačítko konfigurace ASP.NET na panelu nástrojů Průzkumník řešení, jak je znázorněno níže. Webové rozhraní můžete také spustit prostřednictvím automaticky otevíraných oken, která se zobrazí při vložení ovládacích prvků Login.
Obrázek 2
Spustí se nástroj pro správu webu ASP.NET uvedený níže. Správa webu ASP.NET je rozhraní se čtyřmi kartami, které usnadňuje správu nastavení aplikace. K dispozici jsou následující karty:
- Domů
- Zabezpečení Nakonfigurujte uživatele, role a přístup.
- Aplikace Nakonfigurujte nastavení aplikace.
- Zprostředkovatel Nakonfigurujte a otestujte zprostředkovatele členství v aplikacích.
Nástroj pro správu webu umožňuje snadno vytvářet nové uživatele, vytvářet nové role a spravovat uživatele a role. Tato možnost není k dispozici v rozhraní systému Windows. Rozhraní systému Windows umožňuje snadno definovat nastavení autorizace a přidávat, odstraňovat a spravovat zprostředkovatele, funkce, které nejsou v nástroji pro správu webu.
Rozhraní Systému Windows spustíte tak, že otevřete modul snap-in Internetová informační služba, kliknete pravým tlačítkem na aplikaci a zvolíte Vlastnosti. Klikněte na kartu ASP.NET a potom klikněte na tlačítko Upravit konfiguraci. (Aby se tlačítko Upravit konfiguraci povolilo, musí být aplikace spuštěná v ASP.NET 2.0. Verzi ASP.NET můžete nakonfigurovat také v dialogovém okně ASP.NET.) Zobrazí se dialogové okno Nastavení konfigurace ASP.NET, jak je znázorněno níže.
Obrázek 3
Na kartě Obecné jsou uvedené připojovací řetězce a nastavení aplikace. Všechna nastavení kurzíva jsou definována v nadřazených konfiguračních souborech (machine.config nebo web.config na vyšší úrovni) a nastavení, která nejsou kurzíva, pocházejí z konfiguračního souboru aplikace. Pokud je nastavení přidáno, odebráno nebo upraveno na úrovni aplikace, ASP.NET přidá, odebere nebo upraví nastavení na úrovních aplikace web.config místo odebrání nastavení z konfiguračního souboru, ze kterého se dědí.
Karta Ověřování je zobrazená níže. Tady nakonfigurujete nastavení členství. Tady je možné nakonfigurovat nastavení ověřování formulářů, zprostředkovatele členství a zprostředkovatele rolí.
Obrázek 4
Implementace členství v aplikaci
Nejjednodušší způsob, jak implementovat členství ASP.NET 2.0 ve vaší aplikaci, je použít poskytnuté přihlašovací ovládací prvky. Tato metoda umožňuje implementovat základy členství ASP.NET 2.0, aniž byste museli psát jakýkoli kód vůbec.
V ASP.NET 2.0 jsou k dispozici následující ovládací prvky Přihlášení:
Ovládací prvek přihlášení
Ovládací prvek Login (Přihlášení) poskytuje rozhraní pro přihlášení k vašemu systému členství. Poskytuje textové pole pro uživatelské jméno a heslo a tlačítko pro přihlášení. Mnoho dalších běžných funkcí, jako je odkaz pro registraci pro lidi, kteří to ještě neudělali, zaškrtávací políčko, které uživateli umožňuje automaticky se přihlásit při následných návštěvách, odkaz na připomenutí hesla atd. Všechny funkce ovládacího prvku Login lze přizpůsobit pomocí vlastností ovládacího prvku.
V ASP.NET 1.x museli vývojáři napsat poměrně velké množství kódu, aby provedli vyhledávání při použití ověřování pomocí formulářů. S členstvím ASP.NET 2.0 můžete uživatele ověřovat, aniž byste museli psát kód. ASP.NET automaticky vyhledá uživatele za vás. (Pokud používáte ovládací prvek Login bez použití členství ASP.NET, můžete k ověření uživatele použít metodu OnAuthenticate .)
Ovládací prvek LoginView
LoginView ovládací prvek je ovládací prvek šablony, který poskytuje dvě šablony ve výchozím nastavení; AnonymousTemplate a LoggedInTemplate. Zobrazená šablona je určena tím, jestli je uživatel přihlášený k vašemu systému členství. Tento ovládací prvek se obvykle používá k zobrazení ovládacího prvku Login, když se uživatel ještě nepřihlásil, a ovládacího prvku LoginStatus a/nebo jiných ovládacích prvků přihlášení, když se uživatel přihlásil. Pokud používáte správu rolí v aplikaci ASP.NET, může ovládací prvek LoginView zobrazit konkrétní šablonu na základě role uživatele. (Další informace o správě rolí ASP.NET najdete později.)
PasswordRecovery – ovládací prvek
Ovládací prvek PasswordRecovery umožňuje uživatelům dostávat e-maily se svým aktuálním heslem nebo resetovat heslo. Nešifrovaný text a zašifrovaná hesla je možné obnovit a poslat uživatelům e-mail. Pokud má heslo hodnotu hash, nedá se obnovit. Místo toho bude uživatel muset provést resetování hesla.
Ovládací prvek LoginStatus
Ovládací prvek LoginStatus slouží k zobrazení indikátoru přihlášení uživatelům, kteří nejsou přihlášení, a indikátor odhlášení uživatelům, kteří jsou aktuálně přihlášení. Vlastnost Request.IsAuthenticated slouží k určení indikátoru, který se má zobrazit. Indikátor zobrazený ovládacím prvku LoginStatus může být text (implementovaný prostřednictvím vlastností LoginText a LogoutText ) nebo obrázky (implementované prostřednictvím vlastností LoginImageUrl a LogoutImageUrl ).
Když se uživatel odhlásí prostřednictvím ovládacího prvku LoginStatus, je přesměrován na adresu URL určenou vlastností LogoutPageUrl . Pokud tato vlastnost není nastavená, aktuální stránka se aktualizuje. Vzhledem k tomu, že web je pravděpodobně chráněn ověřováním pomocí formulářů, aktualizace aktuální stránky přesměruje uživatele na přihlašovací stránku webu.
Ovládací prvek LoginName
Ovládací prvek LoginName zobrazuje uživatelské jméno uživatele aktuálně přihlášeného k webu.
CreateUserWizard – ovládací prvek
Ovládací prvek CreateUserWizard poskytuje uživatelům pohodlný způsob, jak se zaregistrovat do systému členství. Kroky (implementované jako kolekce WizardSteps) můžete přidat prostřednictvím níže uvedeného rozhraní.
Obrázek 5
CreateUserWizard je ovládací prvek šablony, který je odvozen od třídy Wizard a poskytuje následující šablony:
- Headertemplate Tato šablona řídí vzhled záhlaví průvodce.
- Boční panelTemplate Tato šablona řídí vzhled bočního panelu průvodce.
- StartNavigationTemplate Tato šablona určuje vzhled navigace v průvodci v počátečním kroku.
- StepNavigationTemplate Tato šablona řídí vzhled navigační oblasti, pokud není v počátečním nebo cílovém kroku.
- FinishNavigationTemplate Tato šablona řídí vzhled navigační oblasti v kroku dokončení.
Kromě toho pro každý krok, který přidáte do průvodce, ASP.NET vytvoří vlastní šablonu, která obsahuje ContentTemplate i CustomNavigationTemplate pro tento krok. Úplné podrobnosti o přizpůsobení Průvodce uživatelem najdete v dokumentaci k VS.NET 2005:
Ovládací prvek ChangePassword
Ovládací prvek ChangePassword umožňuje uživatelům změnit heslo. Pokud má vlastnost DisplayUserName hodnotu true (ve výchozím nastavení je false), může uživatel změnit své heslo, když není přihlášený. Pokud je uživatel již přihlášen a vlastnost DisplayUserName má hodnotu true, uživatel bude moci změnit heslo jiného uživatele, který není přihlášen, za předpokladu, že zná ID uživatele tohoto uživatele.
Mějte na paměti, že pokud chcete, aby uživatelé mohli měnit hesla, aniž by se museli přihlašovat, budete muset zajistit, aby stránka, na které se zobrazuje ovládací prvek ChangePassword, umožňovala anonymní přístup. Je zřejmé, že uživatelé budou muset zadat svoje staré heslo, aby si změnili heslo.
Správa rolí
Správa rolí umožňuje přiřadit uživatele ke konkrétní roli a pak omezit přístup k určitým souborům nebo složkám na základě této role. Správa rolí také poskytuje rozhraní API, abyste mohli programově určit roli uživatele nebo určit všechny uživatele v konkrétní roli a odpovídajícím způsobem reagovat.
Správa rolí není požadována v ASP.NET členství, ani členství není požadavkem pro použití správy rolí. Nicméně, oba se vzájemně doplňují a je pravděpodobné, že vývojáři je budou používat ve spojení s sebou navzájem.
Pokud chcete ve své aplikaci povolit správu rolí, proveďte v souboru web.config následující změny:
<roleManager enabled="true" cacheRolesInCookie="true" cookieProtection="All" />
Pokud je atribut cacheRolesInCookie nastavený na hodnotu true, ASP.NET ukládá do mezipaměti členství v roli uživatele v souboru cookie v klientovi. To umožňuje, aby vyhledávání rolí probíhalo bez volání do RoleProvider. Při použití tohoto atributu se vývojářům doporučuje zajistit, aby byl atribut cookieProtection nastavený na vše. (Toto je výchozí nastavení.) To zajišťuje šifrování dat souborů cookie a pomáhá zajistit, aby nedošlo ke změně obsahu souborů cookie. Role lze přidat pomocí nástroje pro správu webu. Umožňuje snadno definovat role, konfigurovat přístup k částem lokality na základě těchto rolí a přiřazovat k rolím uživatele.
Obrázek 6
Jak je znázorněno výše, nové role můžete přidat jednoduše tak, že zadáte název role a kliknete na Přidat roli. Existující role můžete spravovat nebo odstraňovat kliknutím na příslušný odkaz v seznamu existujících rolí.
Při správě role můžete přidávat nebo odebírat uživatele, jak je znázorněno níže.
Obrázek 7
Zaškrtnutím políčka Uživatel je v roli můžete uživatele snadno přidat ke konkrétní roli. ASP.NET automaticky aktualizuje vaši databázi členství příslušnými položkami. Budete také chtít nakonfigurovat pravidla přístupu pro vaši aplikaci. ASP.NET 1.x to vývojáři znají prostřednictvím elementu <authorization> v souboru web.config a tato možnost je stále dostupná v ASP.NET 2.0. Je však jednodušší spravovat pravidla přístupu pomocí nástroje pro správu webu, jak je znázorněno níže.
Obrázek 8
V tomto případě je složka Správa zvýrazněná (je špatně vidět, protože ji nástroj zvýrazňuje světle šedě) a role Správci má udělený přístup. Všichni ostatní uživatelé budou odepřeni. Kliknutím na ikonu hlavy vyberte pravidlo a pak pomocí tlačítek Přesunout nahoru a Dolů pravidla uspořádejte. Stejně jako u autorizačního> prvku ASP.NET <se pravidla zpracovávají v pořadí, ve kterém se zobrazují. Jinými slovy, pokud by bylo pořadí pravidel ve výše uvedeném snímku obrácené, nikdo by neměl přístup ke složce Správa, protože první pravidlo, se kterým by se ASP.NET setkat, by bylo pravidlo, které odepře všem uživatelům přístup do složky.
ASP.NET 2.0 přidá web.config soubor do složky, pro kterou zadáváte pravidlo přístupu. Pravidla přístupu lze upravovat prostřednictvím konfiguračního souboru nebo nástroje pro správu webu. Jinými slovy, nástroj pro správu webu je jednoduše rozhraní, přes které lze konfigurační soubor upravovat v uživatelsky přívětivé prostředí.
Použití rolí v kódu
Rozhraní API pro správu rolí se od verze 1.x nezměnilo. IsInRole Metoda se používá k určení, zda je uživatel v konkrétní roli.
if (User.IsInRole(Administrators)) {
btnManageSite.Visible = true;
}
ASP.NET také vytvoří instanci RolePrincipal jako člena aktuálního kontextu. Objekt RolePrincipal lze použít k získání všech rolí, do kterých uživatel patří, následujícím způsobem:
string[] userRoles = ((RolePrincipal)User).GetRoles();
Použití RoleGroups s ovládacím prvku LoginView
Teď, když rozumíte správě rolí a členství, pojďme stručně probrat, jak ovládací prvek LoginView využívá tuto funkci v ASP.NET 2.0. Jak již bylo popsáno dříve, LoginView ovládací prvek je ovládací prvek šablony, který obsahuje dvě šablony ve výchozím nastavení; AnonymousTemplate a LoggedInTemplate. V dialogovém okně Úlohy LoginView je odkaz (zobrazený níže), který umožňuje upravit skupiny rolí.
Obrázek 9
Každý objekt RoleGroup obsahuje pole řetězců, které definují, na které role se role RoleGroup vztahují. Chcete-li přidat novou skupinu RoleGroup do ovládacího prvku LoginView, klikněte na odkaz Upravit skupiny rolí. Na obrázku výše vidíte, že jsem přidal(a) novou skupinu RolíGroup pro správce. Výběrem této skupiny rolí (Skupina rolí[0]) z rozevíracího seznamu Zobrazení můžu nakonfigurovat šablonu, která se bude zobrazovat pouze členům role Administrators. Na následujícím obrázku jsme přidali novou skupinu rolí, která se vztahuje na členy role Prodej a Distribuce. Tím přidáte druhou skupinu RolíGroup do rozevíracího seznamu Zobrazení v dialogovém okně Úlohy LoginView a všechno přidané do této šablony bude viditelné všem uživatelům v roli Prodej nebo Distribuce.
Obrázek 10
Přepsání existujícího zprostředkovatele členství
Existuje několik způsobů, jak můžete rozšířit funkce ASP.NET členství. Za prvé, můžete samozřejmě změnit existující funkce SqlMembershipProvider třída dědění z něj a přepsání jeho metody. Pokud například chcete implementovat vlastní funkce při vytváření uživatelů, můžete vytvořit vlastní třídu, která dědí z SqlMembershipProvider následujícím způsobem:
public class jForumMembershipProvider : SqlMembershipProvider {
public jForumMembershipProvider() {
}
public override MembershipUser CreateUser(
string username,
string password,
string email,
string passwordQuestion,
string passwordAnswer,
bool isApproved,
object providerUserKey,
out MembershipCreateStatus status) {
// your own implementation
return base.CreateUser(
username,
password,
email,
passwordQuestion,
passwordAnswer,
isApproved,
providerUserKey,
out status);
}
}
Pokud naopak chcete vytvořit vlastního poskytovatele (například k ukládání informací o členství v accessové databázi), můžete si vytvořit vlastního poskytovatele.
Vytvoření vlastního zprostředkovatele členství
Chcete-li vytvořit vlastního zprostředkovatele členství, budete nejprve muset vytvořit třídu, která dědí z Třídy MembershipProvider. Pokud používáte VB.NET, přidá Visual Studio 2005 zástupné procedury pro všechny metody, které je potřeba přepsat. Pokud používáte C#, je na vás, abyste přidali zástupné procedury.
Budete muset přepsat následující:
- ApplicationName – vlastnost
- Funkce ChangePassword
- Funkce ChangePasswordQuestionAndAnswer
- CreateUser – funkce
- DeleteUser – funkce
- Vlastnost EnablePasswordReset
- EnablePasswordRetrieval – vlastnost
- Funkce FindUsersByEmail
- Funkce FindUsersByName
- Funkce GetAllUsers
- GetNumberOfUsersOnline – funkce
- GetPassword – funkce
- Funkce GetUser
- Funkce GetUserNameByEmail
- MaxInvalidPasswordAttempts – vlastnost
- MinRequiredNonAlphanumericCharacters – vlastnost
- MinRequiredPasswordLength – vlastnost
- Vlastnost PasswordAttemptWindow
- Vlastnost PasswordFormat
- PasswordStrengthRegularExpression – vlastnost
- RequiresQuestionAndAnswer – vlastnost
- RequiresUniqueEmail – vlastnost
- ResetPassword – funkce
- Odemknout uživatelskou funkci
- Funkce UpdateUser
- Funkce ValidateUser
To je docela seznam, který je třeba implementovat jako vývojář jazyka C#. Může být pro vás jednodušší vytvořit třídu v VB.NET bez implementace a pak pomocí .NET Reflectoru nebo podobného nástroje převést kód na jazyk C#.
Připojovací řetězec a další vlastnosti by měly být v metodě Initialize nastaveny na výchozí hodnoty. (Metoda Initialize se aktivuje při načtení zprostředkovatele za běhu.) Druhý parametr metody Initialize je typu System.Collections.Specialized.NameValueCollection a je odkazem na <element add> , který je přidružen k vašemu vlastnímu zprostředkovateli v souboru web.config. Tato položka vypadá takto:
<system.web>
<authentication mode="Forms"/>
<membership
defaultProvider="jForumCustomMembershipProvider" >
<providers>
<add name="jForumCustomMembershipProvider"
type="jForumCustomMembershipProvider"
requiresQuestionAndAnswer="true"
connectionString="Provider=Microsoft.Jet.
OLEDB.4.0;Data Source=C:\jForumCustomMembershipProvider\
App_Data\Members.mdb;Persist Security
Info=False"
/>
</providers>
</membership>
</system.web>
Tady je příklad metody Initialize.
public override void Initialize(string name,
System.Collections.Specialized.NameValueCollection config) {
if (config["requiresQuestionAndAnswer"])
_requiresQuestionAndAnswer = true;
_connString = config["connectionString"];
base.Initialize(name, config);
}
Pokud chcete ověřit uživatele při odeslání přihlašovacího formuláře, budete muset použít metodu ValidateUser. Tato metoda se aktivuje, když uživatel klikne na tlačítko přihlášení v ovládacím prvku Login. V této metodě umístíte kód, který provádí vyhledávání uživatelů.
Jak můžete vidět, vytvoření vlastního poskytovatele členství není obtížné a umožňuje vám rozšířit tuto výkonnou funkci ASP.NET 2.0.