public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { string sessionGuid = context.HttpContext.User.FindFirst("sessionId")?.Value; string userGuid = context.HttpContext.User.FindFirst("userGuid")?.Value; ClaimsPrincipal contextPrincipal = context.HttpContext.User as ClaimsPrincipal; //obter as sessões do usuário. Session session = _newSessionService.ObterSessaoAtiva(userGuid); try { // se tiver alguma sessão expirada com menos de 15 minutos de diferença, renovar a sessão por mais 15 min. if (session == null) { Session sessionToKeepAlive = _newSessionService.GetSessionToKeepAlive(userGuid); if (sessionToKeepAlive != null) { SessionViewModel sessionVM = new SessionViewModel() { Session = sessionToKeepAlive }; //SessionData precisa ser null pois ao serializar o SessionVm, acontece uma exception. SessionData não é relevante neste momento sessionVM.Session.SessionData = null; //renova a sessão do NewSessionService var response = await _newSessionService.KeepAliveSession(sessionVM); //renova sessão para acesso aos serviços do Backend _sessionService.KeepAlive(Guid.Parse(userGuid)); _newSessionService.RenovarSessao(sessionToKeepAlive); } else { session = _newSessionService.ObterSessaoExpirada(userGuid); _newSessionService.InvalidarSessao(session); SessionViewModel sessionVM = new SessionViewModel() { Session = session }; sessionVM.Session.SessionData = null; await _newSessionService.InvalidateSession(sessionVM); if (session == null || string.IsNullOrEmpty(sessionGuid) && userGuid == session.UserId.ToString()) { loginRedirectPath = new RedirectToRouteResult(new RouteValueDictionary { { "action", Constants.LOGIN_PAGE_ACTION }, { "controller", Constants.LOGIN_PAGE_CONTROLLER } }); context.Result = loginRedirectPath; return; } } } } catch (Exception ex) { //Log.Information("Contact {@contact} retrieved from cache", contact); //_logger.Information("Teste - Info "); _logger.Error(ex.GetBaseException(), "AuthenticateAttribute - Usuario -> {userGuid}", userGuid); //_logger.Warning("Teste Warning"); loginRedirectPath = new RedirectToRouteResult(new RouteValueDictionary { { "action", Constants.LOGIN_PAGE_ACTION }, { "controller", Constants.LOGIN_PAGE_CONTROLLER } }); context.Result = loginRedirectPath; return; } await next(); }
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { Guid userGuid = Guid.Empty; var headers = context.HttpContext.Request.Headers; string userToken = headers[Constants.API_SESSION_GUID]; if (string.IsNullOrEmpty(userToken)) { //loggar requisição sem token context.Result = new UnauthorizedResult(); return; } Session session = _newSessionService.ObterSessaoUsuario(userToken); userGuid = Helpers.ValidateToken(userToken, _tokenConfigurations); SessionCookieClaimsObjects sessionData = new SessionCookieClaimsObjects(); if (session != null) { sessionData = session.SessionData; } if (session == null || userGuid == Guid.Empty) { context.Result = new UnauthorizedResult(); return; } session = _newSessionService.ObterSessaoAtiva(userGuid.ToString()); Session sessionToKeepAlive = null; try { //renova sessão para acesso aos serviços do Backend _sessionService.KeepAlive(userGuid); // se tiver alguma sessão expirada com menos de 15 minutos de diferença, renovar a sessão por mais 15 min. if (!UsuarioTemContexto(userGuid.ToString()) || session == null) { sessionToKeepAlive = _newSessionService.GetSessionToKeepAlive(userGuid.ToString()); if (sessionToKeepAlive != null) { SessionViewModel sessionVM = new SessionViewModel() { Session = sessionToKeepAlive }; //SessionData precisa ser null pois ao serializar o SessionVm, acontece uma exception. SessionData não é relevante neste momentovar sessionData = sessionVM.Session.SessionData; sessionVM.Session.SessionData = null; //renova a sessão do NewSessionService var response = await _newSessionService.KeepAliveSession(sessionVM); //renova sessão para acesso aos serviços do Backend //_sessionService.KeepAlive(userGuid); sessionToKeepAlive.SessionData = sessionData; _newSessionService.RenovarSessao(sessionToKeepAlive); } else { loginRedirectPath = new RedirectToRouteResult(new RouteValueDictionary { { "action", "LogoutAngular" }, { "controller", Constants.LOGIN_PAGE_CONTROLLER }, { "userGuid", userGuid } }); context.Result = loginRedirectPath; return; } } } catch (Exception ex) { _logger.Error(ex.GetBaseException(), "ApiAuthFilter - Usuario -> {userGuid}", userToken); loginRedirectPath = new RedirectToRouteResult(new RouteValueDictionary { { "action", "LogoutAngular" }, { "controller", Constants.LOGIN_PAGE_CONTROLLER }, { "userGuid", userGuid } }); context.Result = loginRedirectPath; return; } if (sessionToKeepAlive == null) { context.HttpContext.User = session.SessionData.Principal; } else { context.HttpContext.User = sessionToKeepAlive.SessionData.Principal; } await next(); }