【问题标题】:Session variable is always null in SessionTimeOut AttributeSessionTimeOut 属性中的会话变量始终为空
【发布时间】:2019-07-14 21:54:52
【问题描述】:

我正在开发一个 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
{

【问题讨论】:

  • 你如何验证用户。我的意思是表单身份验证?
  • 我建议您将 web.config 中的 timeout 属性的值增加到 20 并检查。 1 太低了。
  • 是的,我正在使用表单身份验证进行身份验证。我已将超时设置为 20,但会话仍然为空

标签: c# asp.net-mvc asp.net-mvc-5 attributes


【解决方案1】:

在没有看到所有代码的情况下,执行以下操作:

  • 不要不要将此属性放在您的登录控制器或操作上。
  • 在您的登录操作/例程中,如果成功,请将用户名值设置为会话。

如果您将此属性注册为全局属性或将其放在具有登录操作的控制器的类级别,则将应用此属性并为您提供无限循环。

我建议不要将与会话交互的属性用作全局变量,因为某些控制器可能不需要会话状态。

【讨论】:

  • 我没有使用这个属性来登录控制器。登录成功时我正在设置会话值。 session 属性假设检查 session 是否为空/空并重定向到登录页面。但是,不知何故,即使在登录操作中设置它之后,会话也总是抛出 null。
【解决方案2】:

尝试在web.config中将其更改为以下

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

其中 timeout 是会话的到期时间。

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 2021-02-27
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多