Vzhledem k tomu, že se mě už asi 10 lidí ptalo na to, jak při použití výborných Altairis Simple Web Providers přidat k uživatelům další informace kromě uživatelského jména. Na samostatný článek o ASP.NET to není (nemám čas dělat další díl seriálu o ASP.NET a vymýšlet, jak to do ukázkové aplikace zakomponovat), ale do blogu je to jako vyšité.
Altairis Simple Web Providers je sada knihoven od Michala Altaira Valáška, která nahrazuje standardní vestavěné providery v ASP.NET pro správu uživatelů, rolí a uživatelských profilů. Databázová struktura, kterou používají vestavění provideři, je dost šílená a komplikovaná, používá desítky stored procedur a mnoho tabulek. Altairovi provideři si vystačí se čtyřmi tabulkami s přehlednou a jasnou strukturou, které můžete pomocí cizích klíčů pěkně provázat se zbytkem databáze.
Co vlastně jednotliví provideři dělají?
Membership provider se stará o přihlašování uživatelů. V Altairových providerech mu odpovídá tabulka Users. Obsahuje uživatelské jméno, zahashované heslo a pár dalších údajů, jako datum registrace, datum posledního přihlášení apod. Membership provider zajišťuje autentizaci uživatelů.
Role provider zařizuje přiřazování uživatelů do rolí, odpovídají mu tabulky Roles a UsersInRoles. Každý uživatel může mít přidělených několik rolí a v každé roli může být několik uživatelů. Co s rolemi budete dělat, už je na vás – většinou si v aplikaci zjistíte, jestli uživatel v dané roli je, a pokud ano, povolíte mu udělat určitou akci, zobrazíte mu nějaké informace atd. Role provider zajišťuje autorizaci uživatelů.
Profile provider se stará o uchovávání informací o uživateli a jeho nastavení. Pokud si tedy ke každému uživateli chcete zapamatovat jeho jméno, je profile provider ten, který se o tyto údaje bude starat.
Nejčastější chyby
To, jak použít membership a role providera, je pěkně popsáno v článku Píšeme webovou aplikaci v ASP.NET krok za krokem (díl 1). Profile providera ovšem v ukázkové aplikaci nepoužíváme a teď už vím, že to je chyba. Z dotazů uživatelů se objevilo několik nešťastníků, kteří si přidávali sloupce do tabulky uživatelů a divili se, že jim to nefunguje, někteří dokonce z tabulky uživatelů odebrali sloupce, které se jim zdály zbytečné.
Je to částečně moje chyba, vůbec mě nenapadlo zdůrazňovat, že tabulky providerů bychom neměli upravovat a nic z nich ubírat. Jedinou výjimkou je tabulka profile providera, o němž ale v článku nepíšu, v kontextu ukázkového příkladu profily postrádají smysl. Jak tedy takovou tabulku vytvořit a jak profily používat?
Vytvoření tabulky profile providera
Přidejte si do databáze tabulku UserProfiles, která bude vypadat nějak takto. Přidal jsem do ní už sloupce FirstName a LastName pro uložení jména a příjmení uživatele. Můžete samozřejmě přidat další sloupečky, případně FirstName a LastName nahradit něčím smysluplnějším.
-- profily
CREATE TABLE [UserProfiles] (
[UserName] VARCHAR(100) NOT NULL,
[LastUpdate] DATETIME NULL,
-- vlastní sloupce
[FirstName] NVARCHAR(50) NULL,
[LastName] NVARCHAR(50) NULL,
-- konec vlastních sloupců
CONSTRAINT [PK_UserProfiles] PRIMARY KEY CLUSTERED ([UserName] ASC),
CONSTRAINT [FK_UserProfiles_Users] FOREIGN KEY ([UserName]) REFERENCES [dbo].[Users] ([UserName]) ON UPDATE CASCADE ON DELETE CASCADE
)
To ještě není vše, další věc, kterou musíte udělat, je přidané vlastní sloupce přidat do souboru web.config. Do sekce system.web přidejte tento kus kódu:
<profile enabled="true" automaticSaveEnabled="false" defaultProvider="MyProfileProvider">
<providers>
<clear/>
<add name="MyProfileProvider" type="Altairis.Web.Security.SimpleSqlProfileProvider" connectionStringName="MyConnectionString"
tableName="UserProfiles" keyColumnName="UserName" lastUpdateColumnName="LastUpdate"/>
</providers>
<properties>
<add name="FirstName" type="String" customProviderData="FirstName;nvarchar;50"/>
<add name="LastName" type="String" customProviderData="LastName;nvarchar;50"/>
</properties>
</profile>
V sekci providers nahraďte hodnotu vlastnosti connectionStringName na název connectionStringu, který používáte pro připojení k databázi. V sekci properties uveďte všechny sloupečky, které jste přidali do tabulky UserProfiles jako vlastní sloupce. Nedávejte tam sloupečky UserName a LastUpdate! Každé vlastnosti můžete přidat ještě atribut defaultValue, což bude výchozí hodnota při vytváření profilu.
Pokud používáte jiné datové typy než string, pak se pro nastavení vlastnosti customProviderData hodí tato převodní tabulka, která je vykopírovaná z dokumentace providerů. Prostřední sloupeček můžete ignorovat, důležitý je první a třetí.
Pokud chcete tedy přidat vlastnost Bio, což může být délkou neomezený text, použijeme pátý řádek, protože na to se hodí v databázi datový typ ntext a v .NETu string. Vlastnost tedy bude vypadat takto:
<add name="Bio" type="String" customProviderData="Bio;ntext"/>
Pokud má datový typ omezení na délku (třeba varbinary), je třeba do vlastnosti customProviderData přidat ještě středník a tuto délku, aby to fungovalo.
Jakmile máte změny v souboru web.config hotové, můžete se vrhnout na práci s profilem uživatele. Je dobré před tím aplikaci celou překompilovat (menu Build a položka Rebuild Web Site, Rebuild Solution nebo tak podobně).
Jak pracovat s profilem v aplikaci?
Velmi jednoduše. Pokud je uživatel přihlášen, jeho údaje o profilu najdete pod Profile.vlastnost, takže třeba křestní jméno bude Profile.FirstName atd. záleží samozřejmě na tom, které vlastnosti jste si přidali do konfiguračního souboru.
Pokud hodnoty vlastností profilu změníte, nezapomňte pak zavolat Profile.Save, aby se změny uložily do databáze.
Více informací o providerech se dozvíte v dokumentaci, která je ke stažení na stránce Altairis providerů.