在ASP.NET Core中会话到期之前显示会话超时警告消息

时间:2017-08-18 20:25:13

标签: asp.net-core asp.net-core-mvc session-timeout

我可以将会话结束设置为以下代码。

git config user.email

我需要在20分钟后扩展会话,并向用户显示会话超时警告消息,以便用户可以从应用程序UI延长他们的时间。

1 个答案:

答案 0 :(得分:6)

您的问题中已有会话超时代码。顺便说一下,默认值是20分钟。如果您想了解更多信息,可以在Configuring Session了解更多信息。

据我所知,ASP.NET没有内置机制来显示会话过期通知消息。所以,我们必须写自己的。

Here是我的,here是用法。您可以随意使用它。 由于我使用了Kendo UI,因此我使用Kendo UI Window进行对话。如果您不想使用Kendo UI,可以用jQuery UI替换它。

enter image description here

_SessionExpireNotification.cshtml

我将设置保留在appsettings.json内。你可以在这个文件中对它们进行硬编码。

@using Asp.Core
@using Microsoft.Extensions.Options
@using Asp.Web.Common

@inject IUserSession UserSession
@inject IOptions<AppSettings> AppSettings

@if (UserSession.IsAuthenticated)
{
    @(Html.Kendo().Window()
          .Name("SessionExpireNotification")
          .Title("Need More Time?")
          .Modal(true)
          .Content(@<text>
            <p>
                Your session is about to expire. You will be automatically signed out in
            </p>
            <h2 style="margin-top: 0">
                <span id="logout-counter-span">0@(AppSettings.Value.CookieAuthentication.SessionExpireNotificationMinutes):00</span>
            </h2>
            <p>
                To continue your session, select <strong>Stay Signed In</strong>.
            </p>
            <p>
                <button id="stay-logged-in-button" type="button" class="btn btn-primary">
                    Stay Signed In
                </button>
                <button id="signout-button" type="button" class="btn btn-default">
                    Sign out
                </button>
            </p>
        </text>)
          .Width(450)
          .Visible(false)
          .Events(ev => ev.Close("onSessionExpireNotificationClose"))
    )

    <script>

        var notificationInterval,
            logoutInterval,
            logoutCounterSpan;

        function startNotificationCounter() {
            var counter = @AppSettings.Value.CookieAuthentication.ExpireMinutes;
            notificationInterval = setInterval(function() {
                    counter--;
                    if (counter === @AppSettings.Value.CookieAuthentication.SessionExpireNotificationMinutes) {
                        $("#SessionExpireNotification").data("kendoWindow").center().open();
                        startLogoutCounter();
                    }
                },
                60000);
        }

        function startLogoutCounter() {
            var counter = @(AppSettings.Value.CookieAuthentication.SessionExpireNotificationMinutes*60);
            logoutInterval = setInterval(function() {
                    counter--;
                    if (counter < 0) {
                        $("#logoutForm").submit();
                    } else {
                        var m = Math.floor(counter / 60);
                        var s = Math.floor(counter % 60);
                        var mDisplay = m < 10 ? "0" + m : m;
                        var sDisplay = s < 10 ? "0" + s : s;
                        logoutCounterSpan.text(mDisplay + ":" + sDisplay);
                    }
                },
                1000);
        }

        function resetCounters() {
            clearInterval(notificationInterval);
            clearInterval(logoutInterval);
            logoutCounterSpan.text("0@(AppSettings.Value.CookieAuthentication.SessionExpireNotificationMinutes):00");
            startNotificationCounter();
        }

        function onSessionExpireNotificationClose() {
            resetCounters();
        }

        $(function() {
            logoutCounterSpan = $("#logout-counter-span");

            startNotificationCounter();

            $("#stay-logged-in-button").click(function() {
                $.get("@Url.Action("Index", "KeepAlive", new {area = ""})",
                    null,
                    function(data) {
                        resetCounters();
                        $("#SessionExpireNotification").data("kendoWindow").center().close();
                    }
                );
            });

            $("#signout-button").click(function() {
                $("#logoutForm").submit();
            });
        });

    </script>
}

扩展会话超时很容易。你只需要调用一个虚拟动作方法。

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Asp.Web.Controllers
{
    [AllowAnonymous]
    public class KeepAliveController : Controller
    {
        //
        // GET: /KeepAlive
        [AllowAnonymous]
        public ActionResult Index()
        {
            return Content("I am alive!");
        }
    }
}