2011-12-20 38 views
8

He leído que para usar el atributo [Authorize] en MVC, solo tiene que colocarlo sobre una acción o sobre la clase de controlador que desea proteger.Cómo utilizar el atributo authorize en MVC3

Mi pregunta es: ¿cómo sabe el atributo Authorize si un usuario está conectado o no? ¿Tengo que proporcionar cualquier objeto Session para que Authorize sepa si un usuario está autorizado?

Respuesta

15

Este atributo funciona al mirar HttpContext.User.Identity.IsAuthenticated.

Si está utilizando algo como FormsAuthentication, se establecerá en true si el usuario tiene una cookie FormsAuthentication válida en su máquina (que puede agregar utilizando FormsAuthentication.SetAuthCookie).

Si usted está interesado en el funcionamiento interno de Authorize, esto es a partir del código fuente de Microsoft publicado:

protected virtual bool AuthorizeCore(HttpContextBase httpContext) { 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 

     IPrincipal user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) { 
      return false; 
     } 

     if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) { 
      return false; 
     } 

     if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) { 
      return false; 
     } 

     return true; 
    } 

Aquí es some more info on FormsAuthentication.

+0

Muchas gracias. ¡Gran recurso! – Jose3d

2

Autorizar la clase de atributo de forma predeterminada toma el httpcontext como argumento. cuando es llamado. Luego verifica el valor de bool HttpContext.User.Identity.IsAuthenticated y actúa en consecuencia. Esto funciona solo si usa la autenticación Forms. Si está utilizando su propia lógica de inicio de sesión (por ejemplo, en objeto de sesión), puede derivar una clase de Authorize Attribute y llamarla.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true,  AllowMultiple = true)] 
public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     clsSession sess = httpContext.Session["Current"] as clsSession; 
     if (sess.IsLogin) return true; 
     return false; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult { ViewName = "Unauthorized" }; 
    } 
} 

continuación, puede utilizar esta clase como esta:

[MyAuthorize] 
public ActionResult Index() 
{ 
    return View(); 
} 

Esto funcionará. Puede usar [Mi Autorización] en lugar de [Autorizar] en todas las acciones del controlador. Si devuelve falso, devolverá una vista (en este caso, "No autorizado"). El nombre de la vista podría ser cualquier cosa y se puede ubicar en la carpeta views/shared.

Cuestiones relacionadas