[asp.net]RoleProvider + SiteMapProvider -> rare functiecall

Pagina: 1
Acties:

  • BM
  • Registratie: September 2001
  • Laatst online: 20:08

BM

Admin Softe Goederen
Topicstarter
Hallo,

Sinds vandaag zit ik met een vreemd probleem in asp.net (2.0) bij het gebruik van een sitemapprovider icm een roleprovider.
Zodra ik in de functie IsAccessibleToUser (aanroepen door SiteMapProvider bij het opbouwen van de menustructuur) wil controlleren of de gebruiker toegang heeft tot de pagina, gebeuren er rare dingen. Bij de aanroep van de volgende regel:
C#:
1
hasaccess = System.Web.Security.Roles.IsUserInRole(username, rolename);

Word er niet naar de funcite IsUserInRole gesprongen, maar naar de functie GetRolesForUser.
hasaccess is hierdoor altijd true, ook als een gebruiker geen rechten voor die pagina heeft. Vreemd is ook dat bij de 2e keer steppen door IsAccessibleToUser(voor 2e node), de debugger niet meer in IsUserInRole stepped, maar deze "overslaat" en hasaccess direct op true zet.

De implementatie van IsAccessibleToUser is weinig spannend:
C#:
1
2
3
4
5
6
7
8
    public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
    {
        bool hasaccess = false;
        string rolename = node.Roles[0].ToString();
        string username = context.User.Identity.Name;
        hasaccess = System.Web.Security.Roles.IsUserInRole(username, rolename);
        return hasaccess;
    }


Als ik vervolgens de code van IsUserInRole ergens anders (losstaand) test, lijkt deze ook gewoon te werken. Waarom deze vervolgens mij gebruikt word op het moment dat ik hem nodig heb is me een raadsel.

is er hier iemand die hier meer ervaring mee heeft, en misschien een idee heeft wat er precies fout gaat?

Precieze implementatie van de functies lijkt me niet nodig, vandaar dat ik deze niet gepost heb

[ Voor 11% gewijzigd door BM op 20-12-2005 13:30 ]

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Verwijderd

De RoleManagerModule zal ervoor zorgen dat de ingelogde gebruiker gerepresenteerd wordt door een RolePrincipal object (mits roles enabled zijn). Wanneer je Roles.IsInRole aanroept met de username van de op dat moment ingelogde gebruiker (User.Identity.Name == userName), zal de IsInRole methode van de RolePrincipal gebruikt worden in plaats van de IsInRole methode van de RoleProvider.

Dit heeft te maken met een optimalisatie: de provider's IsInRole zal doorgaans waarschijnlijk geen data cachen voor een willekeurige gebruiker. RolePrincipal.IsInRole zal daarom eenmalig de roles ophalen voor de huidige gebruiker door GetRolesForUser in de RoleProvider aan te roepen. Deze worden in principe gecached en gebruikt om te bepalen of de huidige gebruiker in een bepaalde rol zit. Indien je dus meerdere malen wil kijken of de huidige gebruiker een rol heeft, zal er dus per call naar bijvoorbeeld een database gegaan worden.

  • BM
  • Registratie: September 2001
  • Laatst online: 20:08

BM

Admin Softe Goederen
Topicstarter
Ok, dat het geoptimaliseerd word snap ik, maar wat ik niet snap is het volgende.
Bij het aanmaken van een sitemap wil ik wel (zelf) voor elke node controleren of een user er rechten to heeft, of niet.
Ik was er daarbij ook vanuit gegaan dat de sitemap gecached word, maar na wat snelle testjes blijkt die iedere keer opnieuw gebouwd te worden, wat dus nogal wat (onnodige) databasehits tot gevolg heeft.

Tevens zit ik nog een beetje met het probleem om vanuit code snel de properties van de huidige ingelogde gebruiker te benaderen. Ik google me te pletter, maar echt wat vinden doe ik nog niet :/

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three