2010-02-05 10 views
22

Normalmente protejo mis acciones con [Authorize] pero esta vez debo verificar si un usuario está autorizado dentro de la acción.Cómo verificar si el usuario está autorizado dentro de la Acción

Ej

if(userIsAuthorized) { 
    //do stuff 
} 
else { 
    //return to login page 
} 

Creo estoy usando 'la autenticación de formularios'

Esta pregunta es un poco similar a this pero ninguna de las respuestas dadas parecía funcionar.

EDITAR: He hecho algo más de excavación: parece que si tengo un punto de corte en una acción que tiene [Authorize], el User.Identity está configurado, pero en Actions without it, el User.Identity está vacío, incluso si estoy conectado en

+0

He solucionado mi problema mediante una solución alternativa de hack-ish, voy a suponer que todas las respuestas son correctas y es debido a mi extraña implementación de autenticación que las cosas son extrañas ... – elwyn

Respuesta

42

Si lo que desea saber si el usuario se registra en:

if (User.Identity.IsAuthenticated) { ... } 

Si usted está tratando de hacer nada en roles específicos:

if (User.IsInRole("Administrators")) { ... } 

La instancia User es una propiedad pública de la clase Controller, por lo que siempre tendrá acceso a ella desde un Controlador que escriba. Si ningún usuario ha iniciado sesión, debe tener un GenericPrincipal para User y GenericIdentity para el User.Identity, por lo que no debe preocuparse por comprobar los valores nulos.

+0

Nuevamente, solo me da 'verdadero' si se usa dentro de un '[Autorizar]' 'd Acción – elwyn

+0

@elwyn: No creo que sea correcto. Acabo de probarlo aquí en una acción sin el atributo '[Authorize]' y 'User.Identity.IsAuthenticated' es' true'. ¿Estás seguro de que la sesión está realmente conectada cuando pruebas esto? – Aaronaught

+0

@Aaronaught Sí, solo comprobé doble (triple), inicié sesión definitivamente mientras lo intentaba, y sigo viendo falsa – elwyn

1

Sugiero primero averiguar qué tipo de Autorización está usando. ;)

La respuesta que publicó es correcta. De lo que recuerdo hurgando en el atributo [Autorizar] y en el código de ActionFilter relacionado, MVC llama internamente a Page.User.Identidad.Asistente como esos ejemplos de código.

+0

Comprobado y es Formularios Autenticación – elwyn

3

Request.IsAuthenticated debería funcionar para lo que estás tratando de hacer.

+3

Si hago eso en una Acción decorada con '[Authorize]' funciona bien, sin embargo si hago eso en esta Acción (no decorado con [Authorize]) siempre es falso, independientemente de si estoy conectado o no. . – elwyn

1

Crear un atributo de esta manera: OnActionExecuting obtendrá ejecutada antes de otro código de la acción

 public class IsAuthenticatedAttribute : ActionFilterAttribute 
     { 
      public override void OnActionExecuting(ActionExecutingContext filterContext) 
      { 
       //do your validations here. and redirect to somewhere if needed. 
       filterContext.HttpContext.Response.Redirect("/") //this will send user to home. 
      } 
     } 

en cada acción en que necesite para revisar, añadir el atributo de esta manera:

[IsAuthenticatedAttribute] 
public ActionResult ActionName(parameters?) 
{ 
    // no need to worry about checking here. 
    //do you action things 
} 

EDITAR: Éste aún completa la acción y luego solo la redirige. No es tan útil.

Cuestiones relacionadas