2009-08-21 16 views
7

Para mis acciones que van a interactuar con la cuenta del usuario, me gustaría crear un objeto "TheUser" además de agregar ese objeto a "ViewData [" TheUser "]" tan pronto como se llame a cualquier acción en mi controlador.Definición de un usuario con User.Identity.Name en el constructor del controlador

Si el usuario está conectado, obtendrá la información del usuario de la base de datos, de lo contrario, el objeto "TheUser" será nulo.

Intenté acceder a "User.Identity.Name" en el constructor del controlador, pero no se crea antes de llamar a ninguna acción.

Estaba buscando filtros de autorización personalizados, pero esos no me permitían crear el objeto "TheUser" y almacenarlo en ViewData.

Este es un breve fragmento de lo que le gustaría lograr:

[Authorize] 
public class HomeController : Controller 
{ 
    User TheUser; 

    public HomeController() 
    { 
     TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; 

     ViewData["TheUser"] = TheUser; 
    } 
} 
+0

esta respuesta me ayudó para MVC3 http://stackoverflow.com/a/1506311/511438 –

Respuesta

15

Creé una clase base Controlador personalizada y agregué una propiedad "Usuario actual" a ella.

En el método Initialize, ubiqué la lógica para obtener el usuario y luego lo agregué a ViewData y la propiedad "CurrentUser" del controlador.

que tenía mis controladores heredan la clase controlador base personalizado y yo era capaz de hacer referencia variable "CurrentUser" en cualquier parte del controlador:

public class CustomControllerClass : Controller 
{ 
    public User CurrentUser { get; set; } 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     if (requestContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      string userName = requestContext.HttpContext.User.Identity.Name; 
      CurrentUser = UserRepository.GetUser(userName); 
     } 

     ViewData["CurrentUser"] = CurrentUser;     
    } 
} 
+0

Cuando heredé mi Controlador de un Controlador de Base, todas mis solicitudes web se detienen después de ejecutar el método Ejecutar de BaseController y no van a los métodos de Acción. Obtengo una página en blanco en el navegador. ¿Hay algo más que tenemos que hacer para ejecutar esto? – teenup

+0

Puneet, por favor eche un vistazo a mi edición. Mi respuesta original fue para ASP.NET MVC 1. Lo actualicé para anular el método 'Initialize' ya que es el lugar de aceptación para hacer este tipo de cosas en MVC 2 y 3 – Omar

+0

Muchas gracias, realmente lo apreciaba. Visto desde hace mucho tiempo, su respuesta fue agradable y concisa. –

1

tiene el usuario que se crea una instancia por cada acción del controlador o sólo los específicos?

Si crea un ActionFilterAttribute, tiene acceso al contexto del controlador. No estoy seguro si esto es cierto para AuthorizationFilters, pero usted podría intentar algo como esto:

public class MyCustomFilter: ActionFilterAttribute 
{ 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["TheUser"] = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; 
     base.OnActionExecuting(filterContext); 
    } 
} 

A continuación, fije esto a las acciones del controlador necesarios.

+0

theuser Se utiliza para cada acción. Lo que me desconcierta es que aunque [Authorize] garantiza que el usuario esté autenticado, no tengo acceso a User.Identity, pero puedo acceder a ViewData. – Omar

4

I fijó controlador de mi base de una manera similar usando el método Constuctor, y pude leer esta información de usuario en la siguiente mannner. Nota: Solo guardo UserId, no el objeto User, pero el objetivo de mi código es mostrar cómo puede obtener la información requerida en el método contriuctor.

public abstract class BaseController : Controller 
{ 
    int _UserId = 0; 

    public int UserId 
    { 
     get { return _UserId; } 
     set { _UserId = value; } 
    } 

    public BaseController() 
    { 
     var userFromAuthCookie = System.Threading.Thread.CurrentPrincipal; 

     if (userFromAuthCookie != null && userFromAuthCookie.Identity.IsAuthenticated) // && !String.IsNullOrEmpty(userFromAuthCookie.Identity.Name)) 
     { 
      busUser userBO = AceFactory.GetUser(); 
      string userNameFromAuthCookie = userFromAuthCookie.Identity.Name; 
      _UserId = userBO.GetUserIdByUsername(userNameFromAuthCookie); 
     } 
    } 
+0

También estaba tratando de devolver al usuario usando User.Identity - 'System.Threading.Thread.CurrentPrincipal' lo arregló para mí - muchas gracias – wheelibin

3
public abstract class YourController : Controller 
{ 
    public YourController() 
    { 
     var user = System.Threading.Thread.CurrentPrincipal; 

     TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(user.Identity.Name) : null; 

     ViewData["TheUser"] = TheUser; 
    } 
} 
Cuestiones relacionadas