【前言】

最近,一个项目中要集成这个功能,就是一个账号只能同时一个人在线. 在网上搜索中,总是零零散散的。 今天写个系统点的,希望可以帮到大家!

【方法】

NO.1 Login.aspx 登录界面

登录按钮:

    /// <summary>/// 登陆验证/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void btnLogin_Click(object sender, EventArgs e){if (tbxPassword.Text.Trim() == "" || tbxUserName.Text.Trim() == ""){MsgBox("用户名或密码不能为空!");return;}string sql ="select * from t_user where username='"+tbxUserName.Text.Trim()+"' and state='1'";     DataTable dt = DbHelper.GetDataTable(sql);if (dt.rows.count <= 0){MsgBox("用户不存在!");return;}else{string macAd = "";if (IsLoginState(user[0].Username, out macAd) || this.chkLogin.Checked) //IsLoginState是个方法在下个语句段中 chkLogined我设置的是强行登陆{if (user[0].Password == tbxPassword.Text.Trim()){Session[Webconfig.UserCode] = user[0].Id;Response.Redirect("Default.aspx");}else{MsgBox("密码错误!");return;}}string[] arrMac = macAd.Split('*');Response.Write(string.Format("<Script>alert('此账号已登录,IP地址({0}),mac地址({1})');history.go(-1);</script>", arrMac[1], arrMac[0]));}}

View Code

 1 string mac;//获得本机MAC地址
 2
 3 private bool IsLoginState(string loginName, out string macAddress)
 4     {
 5         bool flag = true;
 6        // Cache.Insert("DSN", connectionString, null, DateTime.Now.AddMinutes(2), TimeSpan.Zero);
 7         string sUser = Convert.ToString(Cache[loginName]); // 检查是否存在
 8         if (sUser == null || sUser == String.Empty)
 9         {
10             TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);//取得Session的过期时间 System.Web.HttpContext.Current.Session.Timeout
11             HttpContext.Current.Cache.Insert(loginName, loginName, null, DateTime.MaxValue, SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable, null);//将值放入cache己方便单点登录
12             string mac = getIPandMac();
13             HttpContext.Current.Cache.Insert(loginName + "_mac", mac + "*" + Request.UserHostAddress, null, DateTime.MaxValue, SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable, null);
14             //成功登录
15         }
16         else if (Cache[loginName].ToString() == loginName)//如果这个账号已经登录
17         {
18             flag = false;
19         }
20         else
21         {
22             Session.Abandon();//这段主要是为了避免不必要的错误导致不能登录
23         }
24         macAddress = Cache[loginName + "_mac"].ToString();
25         return flag;
26     }
27
28     [DllImport("Iphlpapi.dll")]
29     private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
30     [DllImport("Ws2_32.dll")]
31     private static extern Int32 inet_addr(string ip);
32     private string getIPandMac()
33     {
34         string mac_dest = "";
35         try
36         {
37             string userip = Request.UserHostAddress;
38             string strClientIP = Request.UserHostAddress.ToString().Trim();
39             Int32 ldest = inet_addr(strClientIP); //目的地的ip
40             Int32 lhost = inet_addr("");   //本地服务器的ip
41             Int64 macinfo = new Int64();
42             Int32 len = 6;
43             int res = SendARP(ldest, 0, ref macinfo, ref len);
44             string mac_src = macinfo.ToString("X");
45             if (mac_src == "0")
46             {
47
48             }
49             else
50             {
51                 while (mac_src.Length < 12)
52                 {
53                     mac_src = mac_src.Insert(0, "0");
54                 }
55                 for (int i = 0; i < 11; i++)
56                 {
57                     if (0 == (i % 2))
58                     {
59                         if (i == 10)
60                         {
61                             mac_dest = mac_dest.Insert(0, mac_src.Substring(i, 2));
62                         }
63                         else
64                         {
65                             mac_dest = "-" + mac_dest.Insert(0, mac_src.Substring(i, 2));
66                         }
67                     }
68                 }
69             }
70         }
71         catch (Exception err)
72         {
73             Response.Write(err.Message);
74         }
75         return mac_dest;
76     }

PS:值得注意的是界面得引用一个命名空间:using System.Runtime.InteropServices;

NO.2  退出

退出就是一个清楚缓存和session的过程

View Code

 1 protected void btnExit_Click(object sender, EventArgs e)
 2     {
 3         if (Session["user"]== null)
 4         {
 5             Response.Redirect("~/error/relogin.aspx");
 6         }
 7
 8         if ( Session["user"]!= null)
 9         {
10             long id = Convert.ToInt64(Session["user"]);
11             string sql="select * from t_user where id='"+id+"'";
12             DataTable dt = DbHelper.GetDataTable(sql);
13             HttpContext.Current.Cache.Remove(dt.rows[0]["UserName"]);
14         }
15         Session.Clear();
16         Session.Remove(Session.SessionID);
17
18         Response.Buffer = true;
19         Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
20         Response.Expires = 0;
21         Response.CacheControl = "no-cache";
22         Response.Clear();
23         Response.Redirect("~/Login.aspx");
24     }

【总结】

这只是一个简单的单点登录(单一登陆)的方法,利用的缓存和Session的方法来进行控制。 我想法中还有一个方法就是在数据库中增加字段[State],在进行登录时进行判断,但是频繁的数据库操作,不是一个很好的解决方法,但是也是一种思路,可以尝试。如果下次收集到好的方法在来更新!

转载于:https://www.cnblogs.com/ruicky/archive/2012/09/11/2680297.html

【ASP.NET】 实现 单点登录相关推荐

  1. PHP多台服务实现单点登录,如何在多台服务器上共享Session(PHP/JSP/ASP.NET)以及单点登录(SSO)...

    如何在多台服务器上共享Session(PHP/JSP/ASP.NET)以及单点登录(SSO) Apache Session复制: 使用Memcached来共享PHP Session: 使用Cohere ...

  2. 在ASP.NET 中实现单点登录

    出自:[孟宪会之精彩世界] 发布日期:2005年1月27日 8点48分0秒 [有删改] 由于某些原因,在我们的应用中会遇到一个用户只能在一个地方登录的情况,也就是我们通常所说的单点登录.在ASP.NE ...

  3. Asp.net单点登录解决方案

    Asp.net单点登录解决方案 参考文章: (1)Asp.net单点登录解决方案 (2)https://www.cnblogs.com/wu-jian/archive/2012/11/14/27566 ...

  4. ASP.NET 安全认证(三)—— 用Form 表单认证实现单点登录(Single Sign On) .

    第三部分 实现单点登录(Single Sign On) "等了好久终于等到今天,写了好久终于就快完结,但是网友的反应却让我有一些的伤心.盼了好久终于盼到今天,忍了好久终于把此文撰写,那些受冷 ...

  5. C# ASP.NET程序员整合Java门户单点登录PHPwind论坛博客软件集成项目经验总结

    为什么80%的码农都做不了架构师?>>>    有人曾问,如何正确估算项目周期?你是天天写C#程序的程序员,若做了一个 PHPwind 的单点登录,那估计需要几天时间? 客户只提了一 ...

  6. 临近年关,修复ASP.NET Core因浏览器内核版本引发的单点登录故障

    临近年关,咨询师提出360.搜狗急速浏览器无法单点登录到公司核心产品WD: 重定向过多. 现象 经过测试, 出现单点登陆故障的是搜狗.360等双核浏览器(默认使用Chrome内核), 较新式的Edge ...

  7. asp php 用户登录,一个简单的asp.net 单点登录实现

    以下是实现的效果图: 首先上图的点击火车订票链接,就会打开http://学生信息平台网站/LoginToTrainSite.asa页面. LoginToTrainSite.asa页面的大致代码如下: ...

  8. 实现基于 ASP.NET Forms 身份验证的跨子域单点登录

    对于跨应用程序的 ASP.NET Forms 身份验证,相信大家应该都不陌生,几年前很多文章都介绍了如何实现,比如 MSDN 的 跨应用程序进行 Forms 身份验证,唐朝程序员 的 ASP.NET站 ...

  9. 使用http的asp.net项目接入https的CAS单点登录系统

    使用http的应用网站,接入https的CAS单点登录系统,结果就是登录之后,提示重定向次数太多,打不开应用网站的页面. 猜测原因是单点登录服务器与集成应用网站之间没有建立起有效连接.实际上应该也是, ...

  10. 【C#】ASP.NET网页中添加单点登录功能

    背景 首先,要说明的是,原先需求定义的是,同一个账号只能同时有一个人来登录,如果另外一个登录的话,前一个登陆者就自动被踢掉.本来原先要做成存储到服务器的数据库中,但是后来如果是非正常退出的话 下次就没 ...

最新文章

  1. python根目录_Pycharm使用嵌入式Python
  2. java socket通信
  3. cas单点登陆。就这一篇就够了!!!!!
  4. .NET 容器环境下创建应用 dump 文件
  5. leetcode剑指 Offer 11. 旋转数组的最小数字(二分查找)
  6. docker配置 nacos_Nacos - 阿里开源配置中心
  7. 6-4-2:STL之list——list的模拟实现
  8. centos8搭建nsis交叉编译环境
  9. ctf wav文件头损坏_【CTF入门第二篇】南邮CTF web题目总结
  10. 为了更准确的验证码而奋斗-云大urp教务系统大作战(1.5)
  11. 打包图片上传cdn_Media Buy之Landing Page的资源文件CDN部署方案
  12. 图像融合(四)-- 对比度金字塔
  13. 关于mvn install命令执行报错问题
  14. python获取服务器端的时间
  15. [RK3288][Android6.0] USB UVC 协议简结
  16. 科幻文学入门指南(专业读者分享)
  17. alertmanager集群搭建
  18. android 闪屏图片,Android的闪屏图像尺寸,以适应所有设备Android的闪屏图像尺寸,以适应所有设备(Andro...
  19. 经典解读商业智能BI、大数据、数据中台三者关系
  20. PW系列 | 用windres 编译.rc 资源文件

热门文章

  1. aspmaker学习手记
  2. 中国传感器10大发展趋势
  3. android蓝牙4.0 BLE低功耗应用
  4. 利用Python,简单切割音频文件,只需5行代码!
  5. 职教云助手手机版_职教云查答案助手,职教云查答案,职教云提前获取答案
  6. Cilium Hubble
  7. 一九产业AI速写:汽车篇
  8. java与python哪个值得学_python和java自学哪个好?
  9. java计算机毕业设计科大学生党员之家设计源程序+mysql+系统+lw文档+远程调试
  10. Redis Geospatial 地理位置 类型