2009-01-03 8 views

Respuesta

25

o debería utilizar comprobar los papeles en la página Veiw su auto y no en acciones, de ser así, alguien puede PLZ me muestran ¿cómo comprobar que en la página de vista

Es necesario Haz ambos. Verifique los roles en las acciones como una medida de seguridad y verifique los roles en las vistas para habilitar/deshabilitar los controles específicos.

Dentro de su página de vista de la forma larga de la comprobación de una función es

HttpContext.Current.User.IsInRole("Administrator") 

muchos desarrolladores crearán métodos de la página de ayuda para que pueda terminar con algo más concisa para su aplicación como

public static bool IsAdmin(this ViewUserControl pg) 
{ 
    return pg.Page.User.IsInRole("Administrator") 
} 

entonces en su vista puede simplemente usar this.IsAdmin()

Para mantener su vista desordenada ver en el uso de vistas parciales

<% if (IsAdmin()) 
    { 
     Html.RenderPartial("AdminPanel"); 
    } 
    else 
    { 
     Html.RenderPartial("UserPanel"); 
    } 
%> 
+0

he hecho lo mismo pero no puedo encontrar IsAdmin en vista del controlador ... ¿por qué es así? – Neel

+0

Es un método de ayuda que usted mismo agrega. –

+0

O tal vez Yo he olvidado la declaración 'estática' en la declaración de la función! – Moslem7026

2

sin investigar el mecanismo exacto mvc asp.net utiliza para las funciones de i gritaría un no por poner cualquiera de su lógica de negocio en la vista que es lo que está haciendo papeles si usted está mirando en la vista

+0

En general estoy de acuerdo con esto, pero no soy tan dogmático como para insistir en generar una visión completamente diferente solo para cambiar agregar/eliminar un elemento particular en función del rol del usuario. – tvanfosson

0

I' No estoy tan familiarizado con ASP.NET MVC (todavía) pero ¿no puedes hacer algún tipo de filtro condicional en la Vista? Si el Controlador pasa el rol a la Vista, entonces usted debería poder hacer un filtro condicional y mostrar un cierto bloque de código si el usuario es un administrador. Si desea mostrar una página totalmente separada, entonces tendría una vista múltiple, de lo contrario, puede usar una y hacer algunas condiciones.

en Ruby on Rails que sería algo así como (lo siento, no sé ASP.NET MVC realmente aún):

<% if @user.admin? # is the user an admin %> 
    <h3>Admin Tools</h3> 
<% end %> 
<p>Regular site content</p> 

En los carriles que se carga el contenido extra de los parciales; ASP.NET MVC tiene algo similar pero olvido cómo se llama. Tal vez investigar eso?

Lo siento, no puedo ser de más ayuda, como he dicho, realmente no he llegado a jugar con ASP.NET MVC.

3

Si está utilizando MVC, el objetivo principal del desarrollo es mantener la lógica fuera de la vista y en el controlador. Me parece que estarás mejor en una pista de desarrollo de WebForms que en una pista de MVC.

dicho todo esto, hago un cheque de administración en muchas de mis páginas mediante el uso de un control de la siguiente manera:

<% if ((bool)ViewData["Admin"]) { %> 
    <!-- Show admin controls here --> 
<% } %> 

Pero si usted está tratando de construir la lógica real en la vista entonces necesita averigüe qué puede devolver al controlador para hacer el trabajo y que la vista sea lo más estúpida posible, actuando sobre las banderas que se le envían.

5

Si la pantalla cambia según el rol, y el cambio es pequeño, entonces yo verificaría la vista. Si ciertas vistas están restringidas en función del rol, entonces yo haría la verificación en el controlador. Si las vistas son completamente diferentes (esto sería difícil de imaginar), entonces las vistas separadas por rol pueden ser apropiadas.

Es posible que desee abstraer ciertos componentes de vista específicos de roles en vistas parciales para simplificar su lógica de vista; básicamente, solo tiene que verificar para incluir el parcial o no en función del rol.

Además, además de verificar "IsAuthenticated", movería la lógica de verificación de roles al controlador y pasaría (como datos) a la información de vista sobre qué elementos incluir/excluir en función de la función. Esto evita que la lógica comercial real se desvanezca en su vista.

+0

En mi proyecto, necesito mantener la información de la sucursal. Un administrador del sistema debería poder ver/mantener toda la información de la sucursal. Un administrador de sucursal solo debería ver/mantener su propia información de sucursal. Dos puntos de vista separados, creo. –

2

Si, eso era algo que me estaba molestando así ... pero al mismo tiempo, parece ridícula a cargar la vista completamente diferente para un cambio tan pequeño.

btw cómo configuró esto en su controlador. En este momento, mi controlador se parece al código siguiente, que no creo que sea correcto.

[Authorize(Roles = "Admin, Member")] 
public ActionResult RegistrationInformation() 
{ 

    return View(); 
} 
+0

Eso es correcto, pero planeo implementar una clase Authorize personalizada que pruebe roles enumerados como Roles.Admin | Roles.Member. De esa forma obtengo comprobaciones de tiempo de compilación si todavía existe una función. –

0

Tengo modelo base que se extiende desde todos los demás modelos. En este modelo, he cargado los roles del usuario. Está basado en el método httpcontext.user.isinrole(). Todas las vistas son de tipo fuerte esperando el tipo de modelo base. Por lo tanto, siempre puedo verificar en todas las vistas algo así como Model.CurrentUser.IsInRoles (Role1 | Role2). No solo en vistas, por supuesto, sino en aplicaciones de agujeros.

0

me gusta tener el control total sobre esto en la vista, y me parece que:

<% if (User.IsInRole("Super User")) { %> 
    <h1>Hello world!</h1> 
<% } %> 

Obras para la mayoría de los escenarios. También le permite hacer fácilmente un formateo condicional para otros roles, por ejemplo, "Administrador de contenido", "Registrado", etc.

Me gusta la respuesta de Todd Smith, porque podría cambiar el nombre de la función de administrador y eso requieren solo un cambio, mientras que si coloca la cadena "Superusuario" o "Administrador" directamente en la vista, deberá cambiarla donde sea que haya utilizado el valor.

Cuestiones relacionadas