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