6

tengo 3 modelos [usuario, Papel y UserRole]autorización basada en roles con la lista Modelo

 
Use {ID [PK], Name, Email, Password, .....} 
Role {ID [PK], Name, Description, .......} 
UserRole {UserID [FK], RoleID [FK]} 

tener en cuenta, la autorización basada en funciones en el controlador utilizando el [Autorizar] atributo que especifica que el usuario debe estar en la función de administrador para acceder a cualquier acción del controlador en la clase

[Authorize(Roles = "Administrator")] 
public class PageController : Controller 
{ 
    // Controller code here 
} 

Esto está bien, lo que necesito es,

¿hay alguna manera de asignar mi colección de papel a [Authoriz e] atributo? por ejemplo

Buscaré Roles asignados del Usuario conectado y lo almacenaré en la Lista. ¿Es posible asignar esta lista al atributo [Autorizar]? algo como el siguiente:

[Authorize(Roles = MyDynamicallyLoadedList)] 
public class PageController : Controller 
{ 
    // Controller code here 
} 
+0

1+, Vota, buena pregunta ... –

Respuesta

1

Bueno, dos problemas.

Primero, no puede usar una Lista como parámetro del atributo. Puede usar una matriz en su lugar. http://msdn.microsoft.com/fr-fr/library/ms177221%28v=vs.100%29.aspx

En segundo lugar, los valores del parámetro de atributos deben conocerse en tiempo de compilación: el contenido de su lista solo se conocerá en el tiempo de ejecución.

Usted obtendrá un mensaje como:

Un argumento atributo debe ser una expresión constante, typeof expresión creación de la matriz o expresión de un tipo de parámetro atributo

solución sería la creación de un nuevo atributo de Autorización (que hereda de AuthorizeAttribute) y sobrescribe AuthorizedCore

Un ejemplo (que podría adaptar a su problema) se puede encontrar here

1

Sí. PostAuthenticateRequest

  1. Override en global.asax
  2. Cargar los papeles de la db
  3. Crear un nuevo GenericPrincipal
  4. asignar el director para Thread.CurrentPrincipal y HttpContext.Current.User

Ejemplo:

protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e) 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
     string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name); 
     HttpContext.Current.User = new GenericPrincipal(User.Identity, rolelist); 
     Thread.CurrentPrincipal = HttpContext.Current.User; 
    } 
} 
+0

¿Puedes sugerirme algunos tutoriales o blogs para que pueda ir paso a paso? –

+0

He añadido un ejemplo – jgauffin

+0

Amigo, lo siento, soy bastante nuevo en esto, ¿Podrías darme un ejemplo un poco más detallado? y ¿Cómo se puede aplicar esto al atributo [Autorizar] del controlador? –

Cuestiones relacionadas