Переменная сеанса всегда равна нулю в атрибуте SessionTimeOut - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю над приложением MVC 5.Ниже приведен мой код в web.config для сеанса.

<sessionState mode="InProc" cookieless="AutoDetect" timeout="1" />   

<pages enableSessionState="true">
    <namespaces>
        <add namespace="System.Web.Helpers"/>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Ajax"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Mvc.Routing"/>
        <add namespace="System.Web.WebPages"/>
    </namespaces>
</pages>

Когда пользователь входит в приложение, я сохраняю его имя пользователя в сеансе.

У меня есть следующий код дляАтрибут SessionTimeOutAttribute для проверки, является ли сеанс пустым, но HttpContext.Current.Session["userName"] всегда равен нулю и заканчивается на странице входа в цикл.

public class SessionTimeOutAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;
            if (HttpContext.Current.Session["userName"] ==null)
            {
                filterContext.Result = new RedirectResult("~/Session/Create");
                return;
            }
            base.OnActionExecuting(filterContext);
        }
    }

Обновление: Я использую атрибут [AllowAnonymous]при входе в систему.

[AllowAnonymous]
[HttpPost]
public ActionResult Create(UserModel user)
{
    if (ModelState.IsValid){....}

Если вход успешен, я сохраняю имя пользователя в сеансе Session["userName"] = userAccount.Username;

Вот так я использую атрибут на контроллерах

[Authorize]
[SessionTimeOut]
public class TestController : Controller
{

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

попробуйте изменить его на значение ниже в файле web.config

<sessionState mode="InProc" cookieless="AutoDetect" timeout="20" /> 

, где тайм-аут - это единицы времени истечения сеанса.

0 голосов
/ 21 февраля 2019

Не видя весь ваш код, выполните следующие действия:

  • Не не установите этот атрибут на контроллере входа или действии.
  • В действии входа в систему/ рутина, в случае успеха, установить значение имени пользователя в сеанс.

Если вы зарегистрируете этот атрибут как глобальный или поместите его на уровне класса контроллера, который имеет действие входа в систему, то этот атрибут будетприменить и дать вам бесконечный цикл.

Я предлагаю не использовать атрибуты, которые взаимодействуют с сеансом, как глобальные, так как некоторым контроллерам может не потребоваться состояние сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...