Felhasználó utánzatok

ASP.NET-es fejlesztés közben gyakran előfordul, hogy egy olyan funkciót kell megvalósítanunk, amely felhasználói fiókhoz vagy szerepkörhöz kötött, de még nincs kész a projektünkben a regisztráció vagy a bejelentkezés oldal.Ilyenkor az egyik lehetőség a felhasználói adatbázis gyors összekattintgatása, de ha ezt nem tehetjük meg, akkor nincs más megoldás, mint saját Memebership- és Role providerek készítése, amelyek ugyanúgy bejelentkeztetik a felhasználót, de nem igényelnek adatbázist. Ez egyszerűbb, mint azt első hallásra gondolnánk.

Ha már megvan az ASP.NET alkalmazásunk, az App_Code mappában hozzunk létre egy új osztályt, amely a dummy felhasználóinkat, azaz felhasználó utánzatainkat fogja kezelni. Ezt a DummyMembershipProvider osztályt a MembershipProvider ősosztályból kell származtatnunk. Mivel ez abstract ősosztály, a Studio rögtön fel fogja kínálni az összes felülírandó metódust, melyből a bejelentkezés működéséhez legalább a ValidateUsert implementálnunk kell, például így:

    public class DummyMembershipProvider : MembershipProvider
    {
        private Dictionary<string, string> _users = null;

        internal static string AdminUserName = "admin".ToLowerInvariant();
        internal static string MemberUserName = "user".ToLowerInvariant();

        public override void Initialize( string name, NameValueCollection config )
        {
            this._users = new Dictionary<string, string>();
            this._users.Add( AdminUserName, AdminUserName );
            this._users.Add( MemberUserName, MemberUserName );

            base.Initialize( name, config );
        }

        public override bool ValidateUser( string username, string password )
        {
            if( this._users.ContainsKey( username.ToLowerInvariant() ) )
            {
                return password.Equals( this._users[ username ], StringComparison.OrdinalIgnoreCase );
            }
            return false;
        }

        // Itt még sok metódus van, amely NotImplementedExceptiont dob...
    }

A fenti példa tartalmaz egy admin és egy user felhasználót, a jelszava mindkettőnek megegyezik a felhasználónevével.

Ahhoz, hogy mindez működjön, még át kell kapcsolnunk az ASP.NET-et erre a providerre a web.configban:

    <authentication mode="Forms"/>
    <membership defaultProvider="DummyMembershipProvider">
        <providers>
            <add name="DummyMembershipProvider" type="DummyMembershipProvider"/>
        </providers>
    </membership>

Ezzel már be is tudunk jelentkezni a két felhasználónkkal. Ha még szerepkörök is kellenek, akkor egy DummyRoleProvidert kell származtatnunk az abstract RoleProvider ősosztályból, amelyből legalább az IsUserInRole metódusra szükségünk lesz:

    public class DummyRoleProvider : RoleProvider
    {
        internal static string AdminRoleName = "admins";
        internal static string MemberRoleName = "members";

        public override bool IsUserInRole( string username, string roleName )
        {
            string[] roles = this.GetRolesForUser( username );
            return roles.Contains( roleName );
        }

        public override string[] GetRolesForUser( string username )
        {
            if( username.Equals( DummyMembershipProvider.AdminUserName, 
StringComparison.OrdinalIgnoreCase ) ) { return new string[] { DummyRoleProvider.AdminRoleName }; } else if( username.Equals( DummyMembershipProvider.MemberUserName,
StringComparison.OrdinalIgnoreCase ) ) { return new string[] { DummyRoleProvider.MemberRoleName }; } else { return new string[ 0 ]; } } // ... }

Persze ez sem működik egy kis konfigurálgatás nélkül, de szerencsére csak ennyi kell a web.configba:

    <roleManager enabled="true" defaultProvider="DummyRoleProvider">
        <providers>
            <add name="DummyRoleProvider" type="DummyRoleProvider"/>
        </providers>
    </roleManager>

A fenti két osztály és a hozzá tartozó konfigurációs XML egyébként rettenetesen könnyen kopipésztelhető egyik projektből a másikba és tada, máris van jogosultság-szabályozás a projektben.

A cikkhez tartozó mellékletben a két osztály teljes forráskódja megtalálható.


zip DummyUserSample.zip (5 kB)


Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2009.03.02. 20:31:27 | Permalink | Hozzászólások: 0 | Tárgyszavak: ,


  • Lassú ASP.NET oldal vizsgálata Trace-szel

    Dávid Zoltán Egy nagyon lassú oldalt kellett megvizsgálnom. Az ASP.NET oldalak legfontosabb eseményei között eltelt idő jó kiinduló pont lehet ilyenkor. Ezt nagyon könnyen megnézhetjük a beépített ASP.NET Trace segítségével. A lassú oldal vonatkozó idejei itt láthatók. Tovább »
  • IIS ApplicationPoolIdentity beengedése az SQL Serverbe

    Balássy György (MS RD, ASP.NET MVP, MCTS) Ha egy webhelyet az IIS-ben az ApplicationPoolIdentity nevében futtatunk és a webhely mögött Windows integrált hitelesítéssel működő SQL Server áll, akkor ezt a virtuális fiókot kell beengednünk az SQL Serverbe. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások