如何在长时间无动作后自动跳转到登陆页面

时间:2022-11-28 17:36:46
系统中所有页面都是,长时间没有动作,再次动作时就自动跳转到登陆页面。有没有什么很方便的方法可以实现?

26 个解决方案

#1


用Session会话

#2


所有页面输出一个自动定时跳转脚本

超过时间就做跳转

#3


设置身份验证过期时间就可以了~

#4


在Global.asax中使用Session_End(object sender, EventArgs e)方法跳转

#5


Session_End不会起作用,也无法让客户端重定向

#6


同意郭子,
我试过用Session_End的了,超时客户端无法响应

#7


啊 不好意思啊 我没测试过

#8


在服务端做一个心跳包服务器,用于检测用户是否已经失效
用JS定时发送检测包即可

#9


各位可否说的详细一点呢?我不是很明白如何具体实施啊。。。

#10


是否需要在每个页面都作修改?还是只要在global.asax或者web.config里面添加一些修改即可?

#11


在页面用客户端脚本创建一个定时器,设定为超时所等待时间触发

触发后就做跳转

#12


to郭子:要在每个页面的脚本里面创建吗?

#13


楼主不会不知道Forms验证吧?

    <authentication mode="Forms" > 
        <forms loginUrl="Login.aspx" name="faint"></forms> 
    </authentication>

#14


你可以在页面所继承的基类里用RegisterStartupScript向客户端页面输出脚本

也可以用标准的html引用脚本文件的标记代码

#15


不过我建议你还是参考一下viena的方案

我的确忽略了“再次动作时就自动跳转到登陆页面”中的“再次动作”

#16


阿,羞愧,真的不知道。我是初学者。。。
维也纳能说详细点吗?

#17


转贴一个
如何运用 Form 表单认证 



ASP.NET 的安全认证,共有“Windows”“Form”“Passport”“None”四种验证模式。“Windows”与“None”没有起到保护的作用,不推荐使用;“Passport”我又没用过,唉……所以我只好讲讲“Form”认证了。我打算分三部分: 

第一部分 —— 怎样实现From 认证; 

第二部分 —— Form 认证的实战运用; 

第三部分 —— 实现单点登录(Single Sign On) 

第一部分 如何运用 Form 表单认证 

一、     新建一个测试项目 

为了更好说明,有必要新建一个测试项目(暂且为“FormTest”吧),包含三张页面足矣(Default.aspx、Login.aspx、UserInfo.aspx)。啥?有人不会新建项目,不会新增页面?你问我咋办?我看这么办好了:拖出去,打回原藉,从幼儿园学起…… 

二、     修改 Web.config 

1、 双击项目中的Web.config(不会的、找不到的打 PP) 

2、 找到下列文字 <authentication mode="Windows" /> 把它改成:

<authentication mode="Forms"> 

<forms loginUrl="Login.aspx" name=".ASPXAUTH"></forms> 

</authentication> 

3、 找到<authorization> <allow users="*" /></authorization>换成 

<authorization><deny users="?"></deny></authorization>

这里没什么好说的,只要拷贝过去就行。虽说如此,但还是有人会弄错,如下: 

<authentication mode="Forms"> 

    <forms loginUrl="Login.aspx" name=".APSX"></forms> 

<deny users="?"></deny> 

</authentication> 

若要问是谁把 <deny users="?"></deny> 放入 <authentication> 中的,我会很荣幸地告诉你,那是 N 年前的我:<authentication> 与 <authorization> 都是以 auth 字母开头又都是以 ation 结尾,何其相似;英文单词背不下来的我以为他们是一伙的…… 

三、     编写 .cs 代码——登录与退出 

1、 登录代码: 

a、 书本上介绍的 

      private void Btn_Login_Click(object sender, System.EventArgs e) 

      { 

        if(this.Txt_UserName.Text=="Admin" && this.Txt_Password.Text=="123456") 

        { 

  System.Web.Security.FormsAuthentication.RedirectFromLoginPage(this.Txt_UserName.Text,false); 

  } 



b、 偶找了 N 久才找到的 

private void Btn_Login_Click(object sender, System.EventArgs e) 

      { 
        if(this.Txt_UserName.Text=="Admin" && this.Txt_Password.Text=="123456") 
        { 

System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); 

  Response.Redirect("Default.aspx"); 

  } 


以上两种都可发放验证后的 Cookie ,即通过验证,区别: 

方法 a) 指验证后返回请求页面,俗称“从哪来就打哪去”。比如:用户没登录前直接在 IE 地址栏输入 http://localhost/FormTest/UserInfo.aspx ,那么该用户将看到的是 Login.aspx?ReturnUrl=UserInfo.aspx ,输入用户名与密码登录成功后,系统将根据“ReturnUrl”的值,返回相应的页面 

方法 b) 则是分两步走:通过验证后就直接发放 Cookie ,跳转页面将由程序员自行指定,此方法多用于 Default.aspx 使用框架结构的系统。 

2、 退出代码: 

private void Btn_LogOut_Click(object sender, System.EventArgs e) 
  { 

System.Web.Security.FormsAuthentication.SignOut(); 



四、     如何判断验证与否及获取验证后的用户信息 

有的时候,在同一张页面需要判断用户是否已经登录,然后再呈现不同的布局。有人喜欢用 Session 来判断,我不反对此类做法,在此我只是想告诉大家还有一种方法,且看下面代码: 

if(User.Identity.IsAuthenticated) 
  { 

        //你已通过验证,知道该怎么做了吧? 



User.Identity 还有两个属性AuthenticationType(验证类型)与 Name(用户名称) ,大家要注意的是 Name 属性,此处的User.Identity.Name将得到,验证通过(RedirectFromLoginPage 或SetAuthCookie)时,我们带入的第一个参数 this.Txt_UserName.Text 。这个参数很重要,关系到种种……种种的情况,何出此言,且听下回分解…… 
灵活运用 Form 表单认证中的 deny 与 allow 及保护 .htm 等文件

第二部分 Form 认证的实战运用 



Web.config 的作用范围 

新建项目时, VS.Net 会在项目根目录建立一个内容固定的 Web.config。除了在项目根目录,你还可以在任一目录下建立 Web.config ,条件就是应用程序级别的节点只能在根目录的 Web.config 中出现。至于哪些是应用程序级别节点呢,这个问题嘛,其实我也不太清楚,呵呵。电脑不是我发明的,微软不是我创建的,C# 更不是我说了算的,神仙也有不知道的,所以我不晓得是正常的。话虽如此,只要它不报错,那就是对的。 

关于 Web.config 设置的作用范围,记住以下两点: 

1、 Web.config 的设置将作用于所在目录的所有文件及其子目录下的所有东东(继承:子随父姓) 

2、 子目录下的 Web.config 设置将覆盖由父目录继承下来的设置(覆盖:县官不如现管) 

给大家提个问题:有没有比根目录Web.config 的作用范围还大的配置文件呢?看完第三部分便知分晓。 

六、     学会拒绝与巧用允许 

回到我们在第一回合新建的测试项目“FormTest” ,既然要进行验证,按国际惯例,就得有用户名与密码。那,这些用户是管理员自己在数据库建好呢,还是用户注册、管理员审核好呢。只要不是一般的笨蛋,都知道选择后者。你们还别说,我公司还真有个别项目是管理员连到数据库去建帐号的,属于比较特殊的笨蛋,咱们不学他也罢,还是老老实实添加两个页面吧——注册页面(Register.aspx)与审核页面(Auditing.aspx)。 

问题终于就要浮出水面啦,当你做好 Register.aspx 时,想访问它的时候突然觉得不对劲,怎么又回到了登录页面?你仔细瞧瞧网址,是不是成了:Login.aspx?ReturnUrl=Register.aspx 。怎么办,用户就是因为没有帐号才去访问注册页面的呀?(这句纯属废话,有帐号谁还跑去注册。)我时常对我的同事说:“办法是人想出来滴!!” 

1、 新建一个目录 Public ,用于存放一些公用的文件,如万年历、脚本呀…… 

2、 在“解决方案资源管理器”中右击点击目录 Public ,新增一个 Web.config 

3、 把上述 Web.config 的内容统统删除,仅留以下即可: 

<?xml version="1.0" encoding="utf-8"?> 

<configuration> 

<system.web> 

  <authorization><allow users="*"/></authorization> 

</system.web> 

</configuration> 

终于切入正题了,不容易呀。根据“覆盖”原则,我们知道上述 Web.config 将替代根目录 Web.config 中的 <authorization> 节点设置,即: 

    <allow users="*"/> 替换 <deny users="?"></deny> 

注解:“allow”允许的意思;“*”表示所有用户; 

    “deny” 拒绝的意思;“?”表示匿名用户; 

因此,处于 Public 目录下的文件,允许所有人浏览,包括未验证的用户。把 Register.aspx 拖进来吧,再也不会有人阻止你浏览啦。 

除了注册页面,我们还提到一个审核页面(Auditing.aspx),审核权限一般都在管理员或主管手里,并不想让其他人浏览此页面(真理往往掌握在少数人的手里,这也是没法子的事),怎么办?“办法是人想出来滴”呵呵……新建一个管理员的目录 ManageSys ,在此目录下再新增一个 Web.config。内容如下: 

<?xml version="1.0" encoding="utf-8"?> 

<configuration> 

<system.web> 

<authorization> 

<allow users="Admin"/> 

<deny users="*"/> 

</authorization> 

</system.web> 

</configuration> 



System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); //通过验证,发放 Cookie 

之前我曾强调,要注意,第一个参数很重要,重要到什么程度?说到这,恐怕地球人都知道了——它就是allow与deny的依据。假如此处用户填写的是“Admin”即 this.Txt_UserName.Text = "Admin"; 那么进入系统后,他就能访问 ManageSys 目录下的网页了,其它闲杂人等一律拒之门外。 

#18


看了一下,然后把web.config里面的相应代码改成如下,怎么好象没有起作用?是不是还有哪里需要修改?(我只在web.config里做了改动,其余页面都没有) 

 <authentication   mode="Forms">   
        <forms   name="smmail"   loginUrl="index.aspx"   protection="All"   timeout="5"   />   
    </authentication>
    
    <authorization>
        <allow users="?" /> 
    </authorization>

#19


会话!session

#20


登陆页面的代码要改的
仔细看看先~

#21


o o o o

#22


<authentication   mode="Forms">   
        <forms   name="smmail"   loginUrl="index.aspx"   protection="All"   timeout="5"   />   
    </authentication>
    
    <authorization>
        <allow users="?" /> 
    </authorization>



<meta http-equiv="Refresh" content="Session时间">
定时刷新本页面

#23


AJAX+session嘛

window.onload时触发js定时器

每隔一定时间发个XMLHttpRequest给服务器

服务器收到请求就查看这个请求对应的session有没有

没有就响应要浏览器重定向到login页

#24




    结帖了

#25


该回复于2008-12-19 14:30:47被版主删除

#1


用Session会话

#2


所有页面输出一个自动定时跳转脚本

超过时间就做跳转

#3


设置身份验证过期时间就可以了~

#4


在Global.asax中使用Session_End(object sender, EventArgs e)方法跳转

#5


Session_End不会起作用,也无法让客户端重定向

#6


同意郭子,
我试过用Session_End的了,超时客户端无法响应

#7


啊 不好意思啊 我没测试过

#8


在服务端做一个心跳包服务器,用于检测用户是否已经失效
用JS定时发送检测包即可

#9


各位可否说的详细一点呢?我不是很明白如何具体实施啊。。。

#10


是否需要在每个页面都作修改?还是只要在global.asax或者web.config里面添加一些修改即可?

#11


在页面用客户端脚本创建一个定时器,设定为超时所等待时间触发

触发后就做跳转

#12


to郭子:要在每个页面的脚本里面创建吗?

#13


楼主不会不知道Forms验证吧?

    <authentication mode="Forms" > 
        <forms loginUrl="Login.aspx" name="faint"></forms> 
    </authentication>

#14


你可以在页面所继承的基类里用RegisterStartupScript向客户端页面输出脚本

也可以用标准的html引用脚本文件的标记代码

#15


不过我建议你还是参考一下viena的方案

我的确忽略了“再次动作时就自动跳转到登陆页面”中的“再次动作”

#16


阿,羞愧,真的不知道。我是初学者。。。
维也纳能说详细点吗?

#17


转贴一个
如何运用 Form 表单认证 



ASP.NET 的安全认证,共有“Windows”“Form”“Passport”“None”四种验证模式。“Windows”与“None”没有起到保护的作用,不推荐使用;“Passport”我又没用过,唉……所以我只好讲讲“Form”认证了。我打算分三部分: 

第一部分 —— 怎样实现From 认证; 

第二部分 —— Form 认证的实战运用; 

第三部分 —— 实现单点登录(Single Sign On) 

第一部分 如何运用 Form 表单认证 

一、     新建一个测试项目 

为了更好说明,有必要新建一个测试项目(暂且为“FormTest”吧),包含三张页面足矣(Default.aspx、Login.aspx、UserInfo.aspx)。啥?有人不会新建项目,不会新增页面?你问我咋办?我看这么办好了:拖出去,打回原藉,从幼儿园学起…… 

二、     修改 Web.config 

1、 双击项目中的Web.config(不会的、找不到的打 PP) 

2、 找到下列文字 <authentication mode="Windows" /> 把它改成:

<authentication mode="Forms"> 

<forms loginUrl="Login.aspx" name=".ASPXAUTH"></forms> 

</authentication> 

3、 找到<authorization> <allow users="*" /></authorization>换成 

<authorization><deny users="?"></deny></authorization>

这里没什么好说的,只要拷贝过去就行。虽说如此,但还是有人会弄错,如下: 

<authentication mode="Forms"> 

    <forms loginUrl="Login.aspx" name=".APSX"></forms> 

<deny users="?"></deny> 

</authentication> 

若要问是谁把 <deny users="?"></deny> 放入 <authentication> 中的,我会很荣幸地告诉你,那是 N 年前的我:<authentication> 与 <authorization> 都是以 auth 字母开头又都是以 ation 结尾,何其相似;英文单词背不下来的我以为他们是一伙的…… 

三、     编写 .cs 代码——登录与退出 

1、 登录代码: 

a、 书本上介绍的 

      private void Btn_Login_Click(object sender, System.EventArgs e) 

      { 

        if(this.Txt_UserName.Text=="Admin" && this.Txt_Password.Text=="123456") 

        { 

  System.Web.Security.FormsAuthentication.RedirectFromLoginPage(this.Txt_UserName.Text,false); 

  } 



b、 偶找了 N 久才找到的 

private void Btn_Login_Click(object sender, System.EventArgs e) 

      { 
        if(this.Txt_UserName.Text=="Admin" && this.Txt_Password.Text=="123456") 
        { 

System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); 

  Response.Redirect("Default.aspx"); 

  } 


以上两种都可发放验证后的 Cookie ,即通过验证,区别: 

方法 a) 指验证后返回请求页面,俗称“从哪来就打哪去”。比如:用户没登录前直接在 IE 地址栏输入 http://localhost/FormTest/UserInfo.aspx ,那么该用户将看到的是 Login.aspx?ReturnUrl=UserInfo.aspx ,输入用户名与密码登录成功后,系统将根据“ReturnUrl”的值,返回相应的页面 

方法 b) 则是分两步走:通过验证后就直接发放 Cookie ,跳转页面将由程序员自行指定,此方法多用于 Default.aspx 使用框架结构的系统。 

2、 退出代码: 

private void Btn_LogOut_Click(object sender, System.EventArgs e) 
  { 

System.Web.Security.FormsAuthentication.SignOut(); 



四、     如何判断验证与否及获取验证后的用户信息 

有的时候,在同一张页面需要判断用户是否已经登录,然后再呈现不同的布局。有人喜欢用 Session 来判断,我不反对此类做法,在此我只是想告诉大家还有一种方法,且看下面代码: 

if(User.Identity.IsAuthenticated) 
  { 

        //你已通过验证,知道该怎么做了吧? 



User.Identity 还有两个属性AuthenticationType(验证类型)与 Name(用户名称) ,大家要注意的是 Name 属性,此处的User.Identity.Name将得到,验证通过(RedirectFromLoginPage 或SetAuthCookie)时,我们带入的第一个参数 this.Txt_UserName.Text 。这个参数很重要,关系到种种……种种的情况,何出此言,且听下回分解…… 
灵活运用 Form 表单认证中的 deny 与 allow 及保护 .htm 等文件

第二部分 Form 认证的实战运用 



Web.config 的作用范围 

新建项目时, VS.Net 会在项目根目录建立一个内容固定的 Web.config。除了在项目根目录,你还可以在任一目录下建立 Web.config ,条件就是应用程序级别的节点只能在根目录的 Web.config 中出现。至于哪些是应用程序级别节点呢,这个问题嘛,其实我也不太清楚,呵呵。电脑不是我发明的,微软不是我创建的,C# 更不是我说了算的,神仙也有不知道的,所以我不晓得是正常的。话虽如此,只要它不报错,那就是对的。 

关于 Web.config 设置的作用范围,记住以下两点: 

1、 Web.config 的设置将作用于所在目录的所有文件及其子目录下的所有东东(继承:子随父姓) 

2、 子目录下的 Web.config 设置将覆盖由父目录继承下来的设置(覆盖:县官不如现管) 

给大家提个问题:有没有比根目录Web.config 的作用范围还大的配置文件呢?看完第三部分便知分晓。 

六、     学会拒绝与巧用允许 

回到我们在第一回合新建的测试项目“FormTest” ,既然要进行验证,按国际惯例,就得有用户名与密码。那,这些用户是管理员自己在数据库建好呢,还是用户注册、管理员审核好呢。只要不是一般的笨蛋,都知道选择后者。你们还别说,我公司还真有个别项目是管理员连到数据库去建帐号的,属于比较特殊的笨蛋,咱们不学他也罢,还是老老实实添加两个页面吧——注册页面(Register.aspx)与审核页面(Auditing.aspx)。 

问题终于就要浮出水面啦,当你做好 Register.aspx 时,想访问它的时候突然觉得不对劲,怎么又回到了登录页面?你仔细瞧瞧网址,是不是成了:Login.aspx?ReturnUrl=Register.aspx 。怎么办,用户就是因为没有帐号才去访问注册页面的呀?(这句纯属废话,有帐号谁还跑去注册。)我时常对我的同事说:“办法是人想出来滴!!” 

1、 新建一个目录 Public ,用于存放一些公用的文件,如万年历、脚本呀…… 

2、 在“解决方案资源管理器”中右击点击目录 Public ,新增一个 Web.config 

3、 把上述 Web.config 的内容统统删除,仅留以下即可: 

<?xml version="1.0" encoding="utf-8"?> 

<configuration> 

<system.web> 

  <authorization><allow users="*"/></authorization> 

</system.web> 

</configuration> 

终于切入正题了,不容易呀。根据“覆盖”原则,我们知道上述 Web.config 将替代根目录 Web.config 中的 <authorization> 节点设置,即: 

    <allow users="*"/> 替换 <deny users="?"></deny> 

注解:“allow”允许的意思;“*”表示所有用户; 

    “deny” 拒绝的意思;“?”表示匿名用户; 

因此,处于 Public 目录下的文件,允许所有人浏览,包括未验证的用户。把 Register.aspx 拖进来吧,再也不会有人阻止你浏览啦。 

除了注册页面,我们还提到一个审核页面(Auditing.aspx),审核权限一般都在管理员或主管手里,并不想让其他人浏览此页面(真理往往掌握在少数人的手里,这也是没法子的事),怎么办?“办法是人想出来滴”呵呵……新建一个管理员的目录 ManageSys ,在此目录下再新增一个 Web.config。内容如下: 

<?xml version="1.0" encoding="utf-8"?> 

<configuration> 

<system.web> 

<authorization> 

<allow users="Admin"/> 

<deny users="*"/> 

</authorization> 

</system.web> 

</configuration> 



System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); //通过验证,发放 Cookie 

之前我曾强调,要注意,第一个参数很重要,重要到什么程度?说到这,恐怕地球人都知道了——它就是allow与deny的依据。假如此处用户填写的是“Admin”即 this.Txt_UserName.Text = "Admin"; 那么进入系统后,他就能访问 ManageSys 目录下的网页了,其它闲杂人等一律拒之门外。 

#18


看了一下,然后把web.config里面的相应代码改成如下,怎么好象没有起作用?是不是还有哪里需要修改?(我只在web.config里做了改动,其余页面都没有) 

 <authentication   mode="Forms">   
        <forms   name="smmail"   loginUrl="index.aspx"   protection="All"   timeout="5"   />   
    </authentication>
    
    <authorization>
        <allow users="?" /> 
    </authorization>

#19


会话!session

#20


登陆页面的代码要改的
仔细看看先~

#21


o o o o

#22


<authentication   mode="Forms">   
        <forms   name="smmail"   loginUrl="index.aspx"   protection="All"   timeout="5"   />   
    </authentication>
    
    <authorization>
        <allow users="?" /> 
    </authorization>



<meta http-equiv="Refresh" content="Session时间">
定时刷新本页面

#23


AJAX+session嘛

window.onload时触发js定时器

每隔一定时间发个XMLHttpRequest给服务器

服务器收到请求就查看这个请求对应的session有没有

没有就响应要浏览器重定向到login页

#24




    结帖了

#25


该回复于2008-12-19 14:30:47被版主删除

#26