Ukládání dalších informací o uživateli pomocí Altairis Simple Web Providers

Tomáš Herceg       3. 4. 2009       ASP.NET/IIS       7640 zobrazení

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

Převodní tabulka datových typů

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

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Problém s pridaním dalsieho pola v Profile

Zdravim Tomasi,

uz viac ako tri roky bez problemov frcim na výborných Altairis Simple Web Providers. Vcera som potreboval pridat dalsie polozky do profiles a pracovat s nimi.

Takze som v tabulke Profiles pridal polozky Kraj, KrajS.

Zatial vsetko fungovalo.

V okamziku ked som pridal do web.configu

<profile enabled="true" automaticSaveEnabled="false" defaultProvider="MyProfileProvider">
			<providers>
				<clear />
				<add name="MyProfileProvider" type="Altairis.Web.Security.SimpleSqlProfileProvider, Altairis.Web.Security" connectionStringName="PersonalConnectionString" tableName="Profiles" keyColumnName="UserName" lastUpdateColumnName="LastUpdate" />
			</providers>
			<properties>
        <add name="FullName" type="String" defaultValue="[null]" customProviderData="FullName;varchar;50" /> 
				<add name="BirthDate" type="DateTime" defaultValue="01.01.1900" customProviderData="BirthDate;smalldatetime" />
				<add name="PageSize" type="Int32" defaultValue="10" customProviderData="PageSize;int" />
        <add name="OrgJednotka" type="String" defaultValue="[null]" customProviderData="OrgJednotka;varchar;30" />
        <add name="Kraj" type="Int32" customProviderData="Kraj;int" />
        <add name="KrajS" type="String" defaultValue="[null]" customProviderData="KrajS;varchar;50" />
      </properties>
		</profile>

Sú to tie dve posledne polozky tak stranka pri vytvarani usera vyhodi chybu


Server Error in '/EvidOdbornosti4' Application.

Input string was not in a correct format. 
  Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

 Exception Details: System.FormatException: Input string was not in a correct format.

Source Error: 



Line 46:     public virtual string FullName {
Line 47:         get {
Line 48:             return ((string)(this.GetPropertyValue("FullName")));
Line 49:         }
Line 50:         set {
  

 Source File:  c:\Users\klanduch3007879\AppData\Local\Temp\Temporary ASP.NET Files\evidodbornosti4\3ce4d611\ba8b89cd\App_Code.mbz79mew.6.cs    Line:  48 

Pre info posielam aj kod ktorý volám pri stlaceni tlacitka vytvorit ucet

  protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
    {
        string userName = CreateUserWizard1.UserName;
        ProfileCommon p = ProfileCommon.Create(userName) as ProfileCommon;
        //set params
        p.FullName = "Meno";
        // insert data
        p.Save();
    }

V podstate len vytvori zaznam v tabulke Profiles a do stlpca FullName prida text "Meno"

Akonáhle z webconfigu odoberiem oba riadky

       <add name="Kraj" type="Int32" customProviderData="Kraj;int" />
        <add name="KrajS" type="String" defaultValue="[null]" customProviderData="KrajS;varchar;50" />

vsetko zas normalne funguje

Neviem si s tým od vcera poradit aj som prezrel vsetky fora ohladne toho a nepomohlo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Ukládání dalších informací o uživateli pomocí Altairis Simple Web Providers

ať hledám jak hledám, tak na codeplexu ani jinde žádný návod k Altairis Web Security Toolkit nenacházím

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Ukládání dalších informací o uživateli pomocí Altairis Simple Web Providers

Chcem sa spytat ako zmenit hodnoty v Profile napr Profile.FullName nie pre aktualne prihlaseneho uzivatela ale pre ineho vybraneho uzivatelela ktoreho chcem menit.

Mam jednoduchy script


   String sUser;
    
    
    public void Page_Load()
    {
        if (!Page.User.Identity.IsAuthenticated)
        {
            
            Response.Write("Pracovať s informáciami užívateľa je možné až po prihlásení. Prihláste sa, prosím, na stránke <a href='login.aspx'>Prihlásenie</a>.");
            Response.End();
        }
        else if (!IsPostBack)
               {
            if (Request.QueryString["user"] != null)
            {
                sUser = Request.QueryString["user"];
            }
            InitPageData();
        }
    }

a potom volam ten InitPageData

  void InitPageData()
    {

        MembershipUser user = Membership.GetUser(sUser);
         

        FullNameTextBox.Text = Profile.FullName;
        OrgJednotkaTextBox.Text = Profile.OrgJednotka;
    }

Ale Profile.Fullname mi nacita aktualne prihlaseneho ale ja chcem práve toho sUser.

Dakujem za pomoc, neviem ako to je Provideri Altairis.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback