Es gibt eine Rolle Anbieters Schicht Microsoft Lösung, die das Zwischenspeichern der Rollen eines Benutzers in einem Cookie ermöglicht Daher muss die GetRolesForUser-Methode des Providers nicht aufgerufen werden. Ich glaube, dass das Cookie-Caching Teil der Roles-Klasse ist. Daher sollte es kompatibel sein, solange Sie es von der RoleProvider-Basisklasse implementieren. Es lohnt sich einen Blick auf den Code in reflector zu werfen, um eine Vorstellung davon zu bekommen, wie MS ihre eigenen abstrakten Klassen implementiert und was die statischen Hilfsklassen tun (Rollen und Mitgliedschaft)
Versuchen Sie cacheRolesInCookie = "true" zum roleManager Element in hinzuzufügen Ihre Konfigurationsdatei und sehen Sie, ob sich der Ablauf ändert.
Da Sie Ihre eigene Implementierung eines RoleProviders verwenden, können Sie auch die IsUserInRole-Methode überschreiben und eine eigene Implementierung bereitstellen, um zu überprüfen, ob ein Benutzer in einer Rolle ist.
UPDATE: Dieser Codeblock innerhalb des Roles.IsUserInRole Methode aufgerufen wird:
IPrincipal currentUser = GetCurrentUser();
if (((currentUser != null) && (currentUser is RolePrincipal)) && ((((RolePrincipal) currentUser).ProviderName == Provider.Name) && StringUtil.EqualsIgnoreCase(username, currentUser.Identity.Name)))
{
flag = currentUser.IsInRole(roleName);
}
else
{
flag = Provider.IsUserInRole(username, roleName);
}
Der andere Block ist, was IsUserInRole Ihre benutzerdefinierten Provider-Methode aufrufen wird.
Die Rollen für Ihren Benutzer wurden dem Principal-Objekt noch nicht hinzugefügt. Wenn Sie diesen Schritt noch nicht geschafft haben, OK. Wenn nicht, stellen Sie sicher, dass Sie das tun. Es wird sichergestellt, dass jedes Mal, wenn Sie Roles.IsUserInRole oder User.IsInRole aufrufen, diese Funktionen einen speicherinternen Cache der Rollen für den Benutzer verwenden (sobald sie geladen sind), anstatt jedes Mal zur Datenbank gehen zu müssen. (Obwohl der Basisrollenanbieter und die Rollenmanagerklasse sich darum kümmern sollten.)
Können Sie die Konfigurationsdateieinstellungen für den Rollenanbieter überprüfen? Welche Version von .net benutzt du? Verwalten Sie den Anmeldevorgang manuell oder verwenden Sie das .net-Login-Steuerelement? Haben Sie eine benutzerdefinierte Rollenklasse implementiert? Oder verwenden Sie die System.Web.Security.Roles?
schwer zu sehen, wie das möglich ist, ist es eine abstrakte Methode.Poste deine Implementierung davon. –