0

我已经设置了一个 asp.net 登录控件(由 asp.net 配置提供的控件),它工作正常。

我已将代码添加到 web.config,因此 3 分钟后,它会自动注销用户。

<authentication mode="Forms">
  <!-- Autologout after xxx min. to login.aspx -->
  <forms loginUrl="~/login.aspx" defaultUrl="~/login.aspx" slidingExpiration="true" timeout="3"/>
</authentication>

如果使用该代码,则我会自动注销,如果在 3 分钟后单击链接,则我会进入登录页面。

这是如何运作的?是在登录后 3 分钟还是在 3 分钟不活动后!?

另外,我可以在我的登录页面上添加一个标签,然后它会告诉用户为什么他/她被重定向到登录页面,如果是的话如何?

最后:如何让它在 3 分钟后将用户重定向到登录页面。所以不是在3分钟之后。然后当用户点击一个链接时,但在 3 分钟后,刷新(如果不活动)然后自动跳转到登录页面并用文本显示我的标签,解释为什么他/她没有登录!??

..................................................... ..................................................... ..................................................... ……………………………………………………………………………………………………………………

如果我们查看否,我无法让它工作。2 解决方案。

在我的主页(code_behind)上,我在 page_load Session("logintime") = DateTime.Now.ToString() 中有这个响应写入我在主页 01-10-2012 18:30:42 上得到这个,现在是 18 :37:25 它还没有重定向,我根本没有在浏览器窗口中进行活动。

我的主页代码是。

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="default.aspx.vb" Inherits="_default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
var count = 30000
var timeLoggedIn = new Date('<%=Session("logintime")%>')
var timeLogOut = new Date('<%=Session("logoutTime") %>');

setTimeout(LoggedInCheck(), 30000);

function LoggedInCheck() {
    var now = new Date();
    var now_utc = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
    if (now_utc > timeLogOut) {
        window.location = "http://www.google.dk";
    }
}

function countDown() {
    if (count <= 0) {
       // window.location = redirect;
    } else {
        count--;
        document.getElementById("timer").innerHTML = "This page will redirect in " + count + " seconds."
        setTimeout("countDown()", 1000)
    }
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<span id="timer">  
<script>
countDown();
</script>  
</span> 
</div>
</form>
</body>
</html>

Code_behind

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        Session("logintime") = DateTime.Now.ToUniversalTime().ToString("MM/dd/yyyy hh:mm:ss")
        Session("logoutTime") = DateTime.Now.ToUniversalTime().AddMinutes(3).ToString("MM/dd/yyyy hh:mm:ss")

        Response.Write("time now: " & Session("logintime"))
        Response.Write("<br />")
        Response.Write("reload at time: " & Session("logoutTime"))
    End If

End Sub
4

4 回答 4

0

MSDN 页面SlidingExpiration

如果发出请求并且超过一半的超时间隔已经过去,则滑动到期会重置有效身份验证 cookie 的到期时间。如果 cookie 过期,用户必须重新认证。

所以你可以说它是在 3' 不活动之后。

关于。自动注销消息、此 SO 问题及其答案可以为您提供一个很好的起点。

于 2012-10-01T13:40:27.353 回答
0

您需要最好将用户登录的时间存储在会话中,然后对其进行评估。您还可以使用 cookie 来过期您的时间。

或者,您可以查看 JavaScript >> http://jsfiddle.net/F8umt/3/

但是您应该存储用户登录的时间。根据我的理解,您的脚本可能会在用户每次执行重置登录计数器的任务时刷新。您基本上需要创建一个登录时间,然后从中确定。

我已经更新了代码并对其进行了测试,它似乎在我的机器上运行良好。问题是 Date.Parse 错误地转换了它,所以我稍微改变了它的代码。如果这对您有用,请投票。

也可能重定向到一个页面,该页面会在将会话和 cookie 再次反弹到登录页面之前终止会话和 cookie,否则此代码将无法正常工作。

于 2012-10-01T14:34:48.987 回答
0

好吧,第一种方法是,当用户尝试访问受限页面并且由于自动注销而无法访问时,服务器将他放入登录页面,但使用名为 ReturnURL 的 POST 变量。您可以Try阅读此变量,如果没有Nothing,您可能会认为用户在那里,因为自动注销...

于 2012-10-02T21:16:16.243 回答
-2

这就是解决方案。

在 web.config 添加。

<sessionState timeout="3"></sessionState> 

记住它在分钟内工作。

在您需要测试自动注销的页面上,在 code_behind 中使用它来启动 javascript。

Partial Class _default
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        Page.ClientScript.RegisterStartupScript(Me.[GetType](), "onLoad", "DisplaySessionTimeout()", True)
        Response.Write(Session.Timeout)
    End If

End Sub

End Class

你不需要 response.write 它只是为了测试它是否在 min 内从 web.config 获得了正确的 session.timeout。

在你的主页上使用这个代码,(你不需要计数器,它只是为了测试所以你知道它什么时候重定向你)

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
    var sessionTimeout = "<%= Session.Timeout %>";
    var count = 60 * sessionTimeout
    function DisplaySessionTimeout() {
        setTimeout("location.href='http://www.google.com';", 60000 * sessionTimeout);
    }

    function countDown() {
        count--;
        document.getElementById("timer").innerHTML = "This page will redirect in " + count + " seconds."
        setTimeout("countDown()", 1000)
    }
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<span id="timer">  
<script>
countDown();
</script>  
</span> 
</div>
</form>
</body>
</html>

这里它占用了 session.timeout 和 * 60000 mil。秒。所以3分钟后。将重定向到登录页面或在本例中为 google。

我没有时间用 gridview 测试它,看看它是否重置了计数器,当 session.timeout 被重置 bc 活动时,所以你需要测试它,但这是一个工作代码。

于 2012-10-03T19:02:46.837 回答