2010-11-02 12 views
10

Cuando implemento la clase RoleProvider y llamo Roles.IsUserInRole (string username, string roleName), la ejecución del código primero va al método 'GetRolesForUser (string username)'. ¿Por qué es esto? No quiero repetir todos los roles cuando solo estoy buscando el valor único de si ese usuario pertenece a una función. ¿Es esto una limitación de la clase de proveedor de roles de .NET o hay algo que pueda hacer para controlar un poco más la ejecución del código?IsUserInRole llama a GetRolesForUser?

Aquí está el código de llamada

if (Roles.IsUserInRole(CurrentUser.UserName, "Teacher")) { 

y aquí está la implementación de IsUserInRole

public override bool IsUserInRole(string username, string roleName) { return true; } 

Pero el GetRolesForUser código siempre se implementó por primera vez:

public override string[] GetRolesForUser(string username) { 
     string[] roles = GetAllRoles(); 
     List<string> userRoles = new List<string>(); 
     foreach (string role in roles) { 
      if (IsUserInRole(username, role)) { 
       userRoles.Add(role); 
      } 
     } 
     return userRoles.ToArray(); 
    } 
+1

difícil ver cómo eso es posible, es un método abstracto.Publica tu implementación de la misma. –

Respuesta

4

Hay proveedor de funciones de una capa de Microsoft solución que permite almacenar en caché las funciones de un usuario en una cookie por lo que no necesita llamar al método GetRolesForUser del proveedor. Creo que el almacenamiento en caché de cookies forma parte de la clase Roles, por lo que siempre que implemente desde la clase base RoleProvider, debería ser compatible. Vale la pena ver el código reflector para tener una idea de cómo MS implementa sus propias clases abstractas, y qué hacen las clases estáticas de ayuda (Roles y Membresía)

Intenta agregar cacheRolesInCookie = "true" al elemento roleManager en su archivo de configuración, y vea si el flujo cambia.

Dado que está utilizando su propia implementación de un RoleProvider, también puede anular el método IsUserInRole y proporcionar su propia implementación para verificar si un usuario tiene un rol.

ACTUALIZACIÓN: Este bloque de código se llama dentro del método Roles.IsUserInRole:

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); 
} 

El bloque demás es lo que va a llamar al método IsUserInRole de su proveedor personalizado.

Por lo tanto, los roles para su usuario aún no se han agregado al objeto Principal. Si aún no has llegado a ese paso, está bien. Si no, asegúrate de hacer eso. Se asegurará de que cada vez que llame a Roles.IsUserInRole, o User.IsInRole, esas funciones utilizarán una memoria caché en memoria de los roles para el usuario (una vez cargados) en lugar de tener que ir a la base de datos cada vez. (Aunque el proveedor de roles base y la clase de administrador de funciones deberían encargarse de esto).

¿Se puede verificar la configuración del archivo de configuración para el proveedor de roles? Además, ¿qué versión de .net estás usando? ¿Está gestionando manualmente el proceso de inicio de sesión o está utilizando el control de inicio de sesión .net? ¿Has implementado una clase Roles personalizada? ¿O está utilizando System.Web.Security.Roles?

+0

Intentó agregar cacheRolesInCookie = "true" en el proveedor de funciones y aún se llama a GetRolesForUser. – Josh

+0

¿Encontró una solución para esto? Si paso en dos cadenas aleatorias, voy a InUserInRole, pero si paso en mi directorio activo en el parámetro de nombre de usuario, ¡lo fuerza a GetRolesForUser! – Murphybro2

7

El RoleProvider.IsUserInRole (nombre de usuario, contraseña) se utiliza para el control de funciones para un usuario dado que no es el usuario loggon actual (para el usuario de inicio de sesión actual, también utilizan el Principal.IsInRole en su lugar). Y para RolePrincipal, siempre usa GetRolesForUser para almacenar en caché los roles y realizar la verificación de roles entre la lista de roles en caché. (source)

usuario puede, en lugar de Roles.Provider.IsUserInRoleRoles.IsUserInRole

+3

¿Cuál es la razón por la que el proveedor funciona? – Neeta

Cuestiones relacionadas