Rumah php教程 php手册 (转贴)一套.net窗体身份验证方案(解决了防止用户重复登陆,sessio

(转贴)一套.net窗体身份验证方案(解决了防止用户重复登陆,sessio

Jun 06, 2016 pm 08:01 PM
.net rancangan guna bentuk selesaikan identiti mencegah mengesahkan

http://blog.csdn.net/johnsontj/articles/324369.aspx 一. 设置 web.config 相关选项 先启用窗体身份验证和默认登陆页,如下。 authenticationmode="Forms" formsloginUrl="default.aspx"/forms /authentication 设置网站可以匿名访问,如下 authorization

http://blog.csdn.net/johnsontj/articles/324369.aspx

 

一.      设置web.config相关选项 

 

先启用窗体身份验证和默认登陆页,如下。

 

 

       

 

 

设置网站可以匿名访问,如下

 

 

           

 

 

 

 

 

然后设置跟目录下的admin目录拒绝匿名登陆,如下。注意这个小节在System.Web小节下面。

 

     

 

       

 

           

 

              

 

           

 

       

 

 

把http请求和发送的编码设置成GB2312,否则在取查询字符串的时候会有问题,如下。

 

 

设置session超时时间为1分钟,并启用cookieless,如下。

 

 

为了启用页面跟踪,我们先启用每一页的trace,以便我们方便的调试,如下。

 

 

 

二.      设置Global.asax文件

 

处理Application_Start方法,实例化一个哈西表,然后保存在Cache里

 

    protected void Application_Start(Object sender, EventArgs e)

 

    {

 

       Hashtable h=new Hashtable();

       Context.Cache.Insert("online",h);

}

    在Session_End方法里调用LogoutCache()方法,方法源码如下

 

/// 

    /// 清除Cache里当前的用户,主要在Global.asax的Session_End方法和用户注销的方法里调用      /// 

    public void LogoutCache()

   {

 

      Hashtable h=(Hashtable)Context.Cache["online"];

       if(h!=null)

       {

           if(h[Session.SessionID]!=null)

           h.Remove(Session.SessionID);

           Context.Cache["online"]=h;

       }

}

 

三.      设置相关的登陆和注销代码

 

登陆前调用PreventRepeatLogin()方法,这个方法可以防止用户重复登陆,如果上次用户登陆超时大于1分钟,也就是关闭了所有admin目录下的页面达到60秒以上,就认为上次登陆的用户超时,你就可以登陆了,如果不超过60秒,就会生成一个自定义异常。在Cache["online"]里保存了一个哈西表,哈西表的key是当前登陆用户的SessionID,而Value是一个ArrayList,这个ArrayList有两个元素,第一个是用户登陆的名字第二个元素是用户登陆的时间,然后在每个admin目录下的页刷新页面的时候会更新当前登陆用户的登陆时间,而只admin目录下有一个页打开着,即使不手工向服务器发送请求,也会自动发送一个请求更新登陆时间,下面我在页面基类里写了一个函数来做到这一点,其实这会增加服务器的负担,但在一定情况下也是一个可行的办法.

 

/// 

 

       /// 防止用户重复登陆,在用户将要身份验证前使用

       /// 

       /// 要验证的用户名字

       private void PreventRepeatLogin(string name)

       {

           Hashtable h=(Hashtable)Cache["online"];

           if(h!=null)

           {

              IDictionaryEnumerator e1=h.GetEnumerator();

 

              bool flag=false;

 

              while(e1.MoveNext())

              {    

                  if((string)((ArrayList)e1.Value)[0]==name)

                  {

                     flag=true;

 

                     break;

                  }

              }

              if(flag)

              {

                  TimeSpan ts=System.DateTime.Now.Subtract(Convert.ToDateTime(((ArrayList)e1.Value)[1]));

                  if(ts.TotalSeconds

                     throw new oa.cls.MyException("对不起,你输入的账户正在被使用中,如果你是这个账户的真正主人,请在下次登陆时及时的更改你的密码,因为你的密码极有可能被盗窃了!");

                  else

                     h.Remove(e1.Key);    

              }

           }

           else

           {

              h=new Hashtable();

           }

           ArrayList al=new ArrayList();

           al.Add(name);

           al.Add(System.DateTime.Now);

           h[Session.SessionID]=al;

           if(Cache["online"]==null)

           {

              Context.Cache.Insert("online",h);

           }else

              Cache["Online"]=h; 

    }

 

用户注销的时候调用上面提到LogoutCache()方法

 

四.      设置admin目录下的的所有页面的基类

 

using System;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Collections;

namespace oa.cls

{

    public class MyBasePage : System.Web.UI.Page

    {

       /// 

       /// 获取本页是否在受保护目录,我这里整个程序在OA的虚拟目录下,受保护的目录是admin目录

       /// 

       protected bool IsAdminDir

       {

           get

           {

              return Request.FilePath.IndexOf("/oa/admin")==0;

           }

       }

 

       /// 

       /// 防止session超时,如果超时就注销身份验证并提示和转向到网站默认页

       /// 

       private void PreventSessionTimeout()

       {

           if(!this.IsAdminDir) return;

           if(Session["User_Name"]==null&&this.IsAdminDir)

           {   

 

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

 

              this.Alert("登陆超时",Request.ApplicationPath)

           }

       }

       /// 

 

       /// 每次刷新本页面的时候更新Cache里的登陆时间选项,在下面的OnInit方法里调用.

       /// 

       private void UpdateCacheTime()

       {

           Hashtable h=(Hashtable)Cache["online"];

           if(h!=null)

           {

              ((ArrayList)h[Session.SessionID])[1]=DateTime.Now;

           }

 

           Cache["Online"]=h;

 

       }

 

       /// 

       /// 在跟踪里输出一个HashTable的所有元素,在下面的OnInit方法里调用.以便方便的观察缓存数据

       /// 

       /// 

       private void TraceValues( Hashtable myList) 

       {

           IDictionaryEnumerator myEnumerator = myList.GetEnumerator();

           int i=0;

           while ( myEnumerator.MoveNext() )

           {

              Context.Trace.Write( "onlineSessionID"+i, myEnumerator.Key.ToString());

              ArrayList al=(ArrayList)myEnumerator.Value;

              Context.Trace.Write( "onlineName"+i, al[0].ToString());

              Context.Trace.Write( "onlineTime"+i,al[1].ToString());

              TimeSpan ts=System.DateTime.Now.Subtract(Convert.ToDateTime(al[1].ToString()));

               Context.Trace.Write("当前的时间和此登陆时间间隔的秒数",ts.TotalSeconds.ToString());

              i++;

           }

       }

 

       /// 

       /// 弹出信息并返回到指定页

       /// 

       /// 弹出的消息

       /// 指定转向的页面

       protected void Alert(string msg,string url)

       {

           string scriptString = "<script>alert(/""+msg+"/");location.href=/""+url+"/"</script>";

           if(!this.IsStartupScriptRegistered("alert"))

              this.RegisterStartupScript("alert", scriptString);

       }

 

       /// 

       /// 为了防止常时间不刷新页面造成会话超时,这里写一段脚本,每隔一分钟向本页发送一个请求以维持会话不被超时,这里用的是xmlhttp的无刷新请求

       /// 这个方法也在下面的OnInit方法里调用

       /// 

       protected void XmlReLoad()

       {     

           System.Text.StringBuilder htmlstr=new System.Text.StringBuilder();

           htmlstr.Append("

           htmlstr.Append("function GetMessage(){");

           htmlstr.Append("  var xh=new ActiveXObject(/"Microsoft.XMLHTTP/");");

           htmlstr.Append("  xh.open(/"get/",window.location,false);");

           htmlstr.Append("  xh.send();");

           htmlstr.Append("  window.setTimeout(/"GetMessage()/",60000);");

           htmlstr.Append("}");

           htmlstr.Append("window.onload=GetMessage();");

           htmlstr.Append("       ");

           if(!this.IsStartupScriptRegistered("xmlreload"))

              this.RegisterStartupScript("alert", htmlstr.ToString());

       }

       override protected void OnInit(EventArgs e)

       {

 

           base.OnInit(e);

           this.PreventSessionTimeout();

           this.UpdateCacheTime();

           this.XmlReLoad();

           if(this.Cache["online"]!=null)

           {

              this.TraceValues((System.Collections.Hashtable)Cache["online"]);

           }

       }

    }

}

 

五.      写一个自定义异常类

 

首先要在跟目录下写一个错误显示页面ShowErr.aspx,这个页面根据传递过来的查询字符串msg的值,在一个Label上显示错误信息。

 

 

using System;

namespace oa.cls

{

    /// 

    /// MyException 的摘要说明。

    /// 

    public class MyException:ApplicationException

    {

           /// 

           /// 构造函数

           /// 

           public MyException():base()

           {

 

           }

           /// 

           /// 构造函数

           /// 

           /// 异常消息

           public MyException(string Message):base(Message)

           {

               System.Web.HttpContext.Current.Response.Redirect("~/ShowErr.aspx?msg="+Message);

           }

 

           /// 

           /// 构造函数

           /// 

           /// 异常消息

           /// 引起该异常的异常类

           public MyException(string Message,Exception InnerException):base(Message,InnerException)

          {

           }

       }

} 

 

 

六.总结

我发现在Session里保存的值,比如session["name"]是没有任何向服务器的请求达到1分钟后就会自动丢失,但是session ID是关闭同一进程的浏览器页面后达1分钟后才会丢失并更换的,因为只要你开着浏览器就会有session ID,无论是在url里保存还是在cookies里。不知道这个结论对不对,反正我在设置了session的timeout为1分钟后,session["name"]的值已经没有了,可是SessionID还是旧的,Global.asax里的Session_End里的代码也没有执行,而身份验证票据也没有丢失。我不知道这三者之间的关系是怎样的,谁先谁后,好像在小节可以设置一个timeout属性,不过项目赶的紧,我没时间研究了。

 

以上这些代码比较零散,我花费了2天的时间才总结出来这套方案,不是很完美,但是暂时只能这样了,不能在这方面浪费很多时间了,大家可以把上面的代码组织到一个类里,然后把方法都修改成静态方法方便调用

 

最后大家有什么建议和改进的意见欢迎和我交流。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penyelesaian kepada masalah bahawa sistem Win11 tidak dapat memasang pek bahasa Cina Penyelesaian kepada masalah bahawa sistem Win11 tidak dapat memasang pek bahasa Cina Mar 09, 2024 am 09:48 AM

Penyelesaian kepada masalah sistem Win11 tidak dapat memasang pek bahasa Cina Dengan pelancaran sistem Windows 11, ramai pengguna mula menaik taraf sistem pengendalian mereka untuk mengalami fungsi dan antara muka baharu. Walau bagaimanapun, sesetengah pengguna mendapati bahawa mereka tidak dapat memasang pek bahasa Cina selepas menaik taraf, yang menyusahkan pengalaman mereka. Dalam artikel ini, kami akan membincangkan sebab mengapa sistem Win11 tidak dapat memasang pek bahasa Cina dan menyediakan beberapa penyelesaian untuk membantu pengguna menyelesaikan masalah ini. Analisis sebab Pertama, mari kita menganalisis ketidakupayaan sistem Win11 untuk

Lima petua untuk mengajar anda cara menyelesaikan masalah telefon Black Shark tidak dihidupkan! Lima petua untuk mengajar anda cara menyelesaikan masalah telefon Black Shark tidak dihidupkan! Mar 24, 2024 pm 12:27 PM

Apabila teknologi telefon pintar terus berkembang, telefon bimbit memainkan peranan yang semakin penting dalam kehidupan seharian kita. Sebagai telefon perdana yang memfokuskan pada prestasi permainan, telefon Black Shark sangat digemari oleh pemain. Namun, kadangkala kita juga menghadapi situasi telefon Black Shark tidak boleh dihidupkan Pada masa ini, kita perlu mengambil beberapa langkah untuk menyelesaikan masalah ini. Seterusnya, izinkan kami berkongsi lima petua untuk mengajar anda cara menyelesaikan masalah telefon Black Shark tidak dihidupkan: Langkah 1: Periksa kuasa bateri Pertama, pastikan telefon Black Shark anda mempunyai kuasa yang mencukupi. Ia mungkin kerana bateri telefon telah habis

Bagaimana untuk menyelesaikan masalah menyimpan gambar secara automatik semasa menerbitkan di Xiaohongshu? Di manakah imej yang disimpan secara automatik semasa menyiarkan? Bagaimana untuk menyelesaikan masalah menyimpan gambar secara automatik semasa menerbitkan di Xiaohongshu? Di manakah imej yang disimpan secara automatik semasa menyiarkan? Mar 22, 2024 am 08:06 AM

Dengan perkembangan media sosial yang berterusan, Xiaohongshu telah menjadi platform untuk lebih ramai golongan muda berkongsi kehidupan mereka dan menemui perkara yang indah. Ramai pengguna bermasalah dengan isu autosimpan semasa menyiarkan imej. Jadi, bagaimana untuk menyelesaikan masalah ini? 1. Bagaimana untuk menyelesaikan masalah menyimpan gambar secara automatik semasa menerbitkan di Xiaohongshu? 1. Kosongkan cache Pertama, kita boleh cuba mengosongkan data cache Xiaohongshu. Langkah-langkahnya adalah seperti berikut: (1) Buka Xiaohongshu dan klik butang "Saya" di sudut kanan bawah (2) Pada halaman tengah peribadi, cari "Tetapan" dan klik padanya (3) Tatal ke bawah dan cari "; Kosongkan Cache". Klik OK. Selepas mengosongkan cache, masukkan semula Xiaohongshu dan cuba siarkan gambar untuk melihat sama ada masalah penjimatan automatik telah diselesaikan. 2. Kemas kini versi Xiaohongshu untuk memastikan bahawa Xiaohongshu anda

Pemacu tidak boleh dimuatkan pada peranti ini Bagaimana untuk menyelesaikannya? (Diuji secara peribadi dan sah) Pemacu tidak boleh dimuatkan pada peranti ini Bagaimana untuk menyelesaikannya? (Diuji secara peribadi dan sah) Mar 14, 2024 pm 09:00 PM

Semua orang tahu bahawa jika komputer tidak dapat memuatkan pemacu, peranti mungkin tidak berfungsi dengan betul atau berinteraksi dengan komputer dengan betul. Jadi bagaimana kita menyelesaikan masalah apabila kotak gesaan muncul pada komputer bahawa pemandu tidak boleh dimuatkan pada peranti ini? Editor di bawah akan mengajar anda dua cara untuk menyelesaikan masalah dengan mudah. Tidak dapat memuatkan pemacu pada peranti ini Penyelesaian 1. Cari "Pengasingan Kernel" dalam menu Mula. 2. Matikan Integriti Memori, dan ia akan menggesa "Integriti Memori telah dimatikan. Peranti anda mungkin terdedah. Klik di belakang untuk mengabaikannya, dan ia tidak akan menjejaskan penggunaan." 3. Masalah boleh diselesaikan selepas menghidupkan semula mesin.

Kaedah terperinci untuk menyahsekat menggunakan pengesahan bantuan rakan WeChat Kaedah terperinci untuk menyahsekat menggunakan pengesahan bantuan rakan WeChat Mar 25, 2024 pm 01:26 PM

1. Selepas membuka WeChat, klik ikon carian, masukkan pasukan WeChat, dan klik perkhidmatan di bawah untuk masuk. 2. Selepas memasukkan, klik pilihan alat layan diri di sudut kiri bawah. 3. Selepas mengklik, dalam pilihan di atas, klik pilihan untuk menyahsekat/merayu untuk pengesahan tambahan.

Mentafsir ralat Oracle 3114: punca dan penyelesaian Mentafsir ralat Oracle 3114: punca dan penyelesaian Mar 08, 2024 pm 03:42 PM

Tajuk: Analisis Ralat Oracle 3114: Punca dan Penyelesaian Apabila menggunakan pangkalan data Oracle, anda sering menghadapi pelbagai kod ralat, antaranya ralat 3114 adalah yang biasa. Ralat ini biasanya melibatkan masalah pautan pangkalan data, yang mungkin menyebabkan pengecualian apabila mengakses pangkalan data. Artikel ini akan mentafsir ralat Oracle 3114, membincangkan puncanya dan memberikan kaedah khusus untuk menyelesaikan ralat dan contoh kod yang berkaitan. 1. Definisi ralat 3114 ralat Oracle 3114 lulus

Panduan untuk menyelesaikan masalah pemasangan WordPress dalam satu artikel Panduan untuk menyelesaikan masalah pemasangan WordPress dalam satu artikel Feb 29, 2024 am 11:06 AM

WordPress ialah sistem pengurusan kandungan sumber terbuka yang sangat popular Ramai pengguna dan perniagaan individu memilih untuk menggunakan WordPress untuk membina dan mengurus tapak web mereka sendiri. Walau bagaimanapun, semasa pemasangan WordPress, anda kadangkala menghadapi beberapa masalah, seperti ralat sambungan pangkalan data, isu kebenaran fail, dsb. Artikel ini akan memberikan panduan untuk menyelesaikan masalah pemasangan WordPress biasa dan membantu pengguna menyelesaikan masalah dengan cepat melalui contoh kod tertentu. Masalah 1: Ralat sambungan pangkalan data semasa memasang WordPress

Adakah anda bimbang tentang kod kacau-balau WordPress? Cuba penyelesaian ini Adakah anda bimbang tentang kod kacau-balau WordPress? Cuba penyelesaian ini Mar 05, 2024 pm 09:27 PM

Adakah anda bimbang tentang kod berantakan bahagian belakang WordPress? Cuba penyelesaian ini, contoh kod khusus diperlukan Dengan aplikasi WordPress yang meluas dalam pembinaan laman web, ramai pengguna mungkin menghadapi masalah kod bercelaru di bahagian belakang WordPress. Masalah seperti ini akan menyebabkan antara muka pengurusan latar belakang memaparkan aksara bercelaru, menyebabkan masalah besar kepada pengguna. Artikel ini akan memperkenalkan beberapa penyelesaian biasa untuk membantu pengguna menyelesaikan masalah watak bercelaru dalam bahagian belakang WordPress. Ubah suai fail wp-config.php dan buka wp-config.

See all articles