2012-11-20 17 views
8

Próbuję utworzyć atrybut uprawnień do skonfigurowania w każdej akcji kontrolerów, więc ten atrybut niestandardowy powinien pobrać identyfikator sessionId od użytkownika. Mój kod to tak:Pobierz sesję z HttpActionContext

public class PermissionChecker: ActionFilterAttribute 
{ 
    private int _permissionId { get; set; } 
    private IUserSelectorService _userService { get; set; } 

    public PermissionChecker(int permissionId) 
    { 
     _permissionId = permissionId; 
     _userService = new UserSelectorService(); 
    } 

    public PermissionChecker(int permissionId, IUserSelectorService userService) 
    { 
     _permissionId = permissionId; 
     _userService = userService; 
    } 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     if (_userService.HasPermission(_permissionId, /* here I must pass the session["Id"]*/)){ 
      base.OnActionExecuting(actionContext); 
      return; 
     } 
     throw new HttpException(401, "Unauthorized"); 
    } 
} 

Odpowiedz

9

Użyj tego

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if(filterContext.HttpContext.Session != null) 
    { 
     var id = filterContext.HttpContext.Session["Id"];   
    } 
} 

EDIT Biorąc pod uwagę fakt, że używasz MVC 4 i nie masz

public override void OnActionExecuting(ActionExecutingContext filterContext) 

Spróbuj użyć

+0

Używam MVC4, więc nie ma żadnego przesłonięcia z ActionExecutingContext – MuriloKunze

+0

Ok. Zakładam, że actionContext nie ma właściwości HttpContext, która umożliwia dostęp do sesji – Mihai

+0

Tak, nie ma. – MuriloKunze

0

jeśli próbujesz uzyskać dostęp przy użyciu zdarzenia ActionFilterAttribute, a następnie OnActionExecting, nie spowoduje to dostępności HttpContext z System.Web.Http.

Zamiast tego Jeśli próbujesz uzyskać dostęp za pomocą System.Web.Mvc, dostarczysz bieżącą sesję z zdarzeniem onActionExecting przy pomocy klasy ActionExecutingContext.