asp.net - MVC session 过期 - 从剩下的地方继续

标签 asp.net asp.net-mvc session

我们有一个需要登录的内部 ASP.NET MVC 应用程序。登录效果很好并且符合预期。我们的 session 过期时间为 5 分钟。在停留在单个页面上一段时间后,用户就失去了 session 。如果他们尝试刷新当前页面或浏览到另一个页面,他们将获得登录页面。

我的问题是(重新登录后)在哪里告诉 MVC 重定向到他们的(刷新/浏览)尝试而不是始终获取 HOME Controller 页面?

最佳答案

通常这应该自动发生。当匿名用户访问 protected 资源时(他是匿名的,因为他的 session 已过期),FormsAuthentication 模块会拦截此请求并通过附加 ReturnUrl 重定向到您在 web.config 中注册的 loginUrl 指向 protected 资源的查询字符串参数。

因此,例如,如果您将 ~/Account/LogOn 配置为登录 URL,并且匿名用户尝试访问 ~/Foo/Bar protected 资源,他将被重定向到 ~/Account/LogOn?ReturnUrl=%2FFoo%2FBar

然后,他将看到一个登录页面,他将在其中输入凭据并将表单提交到 Account< 上的 [HttpPost] LogOn 操作 Controller 。将验证凭据,如果有效,将生成新的表单例份验证 cookie,并将用户重定向到最初请求的 protected 资源。

以下是 LogOn 操作的相应代码:

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

请注意,成功身份验证后,用户如何重定向到默认的 Home/IndexreturnUrl 参数。

当然,我在这里讲述的所有故事对于 Visual Studio 创建的默认 ASP.NET MVC 模板都是正确的。如果由于某种原因您修改了此模板,这可能会解释您所观察到的行为。

无论如何,从我的回答中要记住的是,如果您使用表单例份验证,该模块会将最初请求的 protected 资源作为 ReturnUrl 查询字符串参数传递到配置的登录页面。因此,您需要在身份验证成功后将用户重定向到此页面。

关于asp.net - MVC session 过期 - 从剩下的地方继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19518846/

相关文章:

asp.net-mvc - 使用 Autofac 将服务注入(inject)基类

c# - 为什么 TempData 由 Session 支持

asp.net-mvc - ASP.Net MVC : Creating custom controls kind of messy?

java - 程序运行时的 Dropwizard session

c# - 在gridview上获取两次点击事件

c# - 当 UpdatePanel 触发时,IE8 光标跳到文本区域的末尾

javascript - 如何使用 Sweet Alert 进行确认?

c# - ASP.Net 网站管理工具“安全”选项卡错误。无法访问寄存器 0x​​104567911

java - session.invalidate() IllegalStateException

iphone session 管理