会话在mvc中到期后如何使整个页面重定向到登录?

时间:2014-12-10 09:26:56

标签: javascript asp.net-mvc visual-studio session asp.net-ajax

我在每个控制器上覆盖并修饰了这个属性,并在所有普通视图上完美地完成了它的工作:

public class MyAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authroized = base.AuthorizeCore(httpContext);
        if (!authroized)
        {
            // the user is not authenticated or the forms authentication
            // cookie has expired
            return false;
        }

        // Now check the session:
        var checkUser = httpContext.Session["LoggedUserID"];

        if (checkUser == null)
        {
            // the session has expired
            return false;
        }

        return true;
    }
}

我有很多情况需要在父视图中更新某个部分视图:

<script type="text/javascript">
$(function () {
    $(".sensor-delete-table").on("click", function () {
        var divSensorNames = $("#sensorNames");
        var tr = $(this).parents('tr:first');
        var PredefineViewsItemID = tr.find("#PredefineViewsItemID").html();
        var PredefineViewID = tr.find("#PredefineViewID").html();
        var amount = parseInt($("[data-id='" + PredefineViewID + "']").text());
        var flag = confirm('@Html.Localize("deleteCheck")');
        var urlShowNewSensors = "@Url.Action("ShowSensorNames", "PredefinedViews", new { predefinedViewID = "PredefineViewID" })";
        urlShowNewSensors = urlShowNewSensors.replace("PredefineViewID", PredefineViewID);
        if (PredefineViewID != "" && flag) {
            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: '@Url.Action("DeleteSensor", "PredefinedViews")',
                data: JSON.stringify({ pviID: PredefineViewsItemID, pID: PredefineViewID }),
                dataType: "json",
                complete: function () {

                    var urlShowSensors = "@Url.Action("ShowSensorNames", "PredefinedViews", new { predefinedViewID = "PredefID" })";
                    urlShowSensors = urlShowSensors.replace("PredefID", PredefineViewID);
                    $(divSensorNames).load(urlShowSensors); //this is the partial view inside the parrent view that I'm updating
                },

            });
        }
    });
});

这里发生的事情是,如果会话“LoggedUserID”已过期,它将会做的是它只会将div容器divSensorNames(部分视图所在的位置)重定向到登录页面,但是将整个parrent页面保留在其中的位置是。所以我最终得到一个看起来很愚蠢的网站。 我想要的是整个页面重定向到登录我应该做些什么建议或修改才能正常使用我的引用功能?基本上我的所有功能都顺利运行,除了这个“小化妆品问题”。

我的web.config中也有这个:

<system.web>
<sessionState mode="InProc" timeout="30" />
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />
<authentication mode="Forms">
  <forms loginUrl="~/Welcome/Login"></forms>
</authentication>

我的退出方法:

public ActionResult Logout()
    {
        Session.RemoveAll();
        FormsAuthentication.SignOut();
        return RedirectToAction("Login", "Login");
    }

2 个答案:

答案 0 :(得分:3)

这是我们在10小时后(与web.config中的会话到期时间相同的值)在不活动时重定向到登录页面的操作。

在Layout.cshtml中,添加以下方法:

    $(function () {
        var _redirectTimeout = 10 * 60 * 60 * 1000; // ten hours timeout - test with 10 * 1000 for ten seconds :)
        var _redirectUrl = '@Url.Action("LogOff", "Account")'; // login URL

        var _redirectHandle = null;

        function resetRedirect() {
            if (_redirectHandle) clearTimeout(_redirectHandle);
            _redirectHandle = setTimeout(function () {
                window.location.href = _redirectUrl;
            }, _redirectTimeout);
        }

        $.ajaxSetup({ complete: function () { resetRedirect(); } }); // reset idle redirect when an AJAX request completes

        resetRedirect(); // start idle redirect timer initially.
    });

<强> AccountController.cs

    [AllowAnonymous]
    [Audit]
    public ActionResult LogOff()
    {
        var userName = "Unknown";

        if (HttpContext.User != null && !string.IsNullOrWhiteSpace(HttpContext.User.Identity.Name))
        {
            userName = HttpContext.User.Identity.Name;
        }

        _logger.Log(string.Format("LogOff request received for user : {0}", userName), 
            LogCategory.Information, GetUserIdentifiableString(userName));

        return LogUserOut();
    }

    private ActionResult LogUserOut()
    {
        Session.Abandon();
        _cookieHelper.ClearAllCookies();

        try
        {
            var membershipUser = Membership.GetUser(false);

            _membershipService.SignOut();

            membershipUser.LastActivityDate = DateTime.UtcNow.AddMinutes(-(Membership.UserIsOnlineTimeWindow + 1));
            _membershipService.UpdateUser(membershipUser);
        }
        catch
        {
            _membershipService.SignOut();
        }

        return RedirectToAction("Login", "Account");
    }

注意:以上代码仅供参考,仅使用项目中所需的内容。

答案 1 :(得分:0)

以下代码仅在用户尝试重新加载或在会话到期后尝试在应用程序中转到其他页面时才有用。

将以下代码放在Web.config文件中

 <system.web>
   <authentication mode="Forms">
     <forms loginUrl="~/Welcome/Login" />
   </authentication>
</system.web>

请注意您在应用程序中的上述表单标记中的loginUrl上的登录页面的URl。