.NET 单点登录

.NET(单点登录的设计和实现) 序:前几天不小心吃饭咬到舌头,发炎,话讲不清楚,吃饭吃不下,,也不想弄其他东西,博文也好几天没有更新,买了点中药,吃了几天舌头好多,想想赶紧把博文补上。这是毕业设计的一篇论文。目的是要实现单点登录的功能。个人理解和实现的单点登录:两个业务系统(业务系统是已经存在的,需要将业务系统融入到当中,如何修改业务系统的代码,下面会有说)A、B,一个认证服务中心SSO。 一开始拿到手,几乎什么思路都没有,然 阅读详情
这里指的单点,泛指在WEB服务端,一个账户同一时刻只能存在一个票据!

大家开发中可能都碰到的一个问题,怎么使同一个用户,在同一时间内只允许登录一次。

很多人都会想到在数据库中用一个标识字段,登录进去置1,退出置0,登录时判断这个字段,如果是1就说明此用户在线,不允许登录,这个方案看似有效,但在实际使用中发现问题很多,比如,用户不是通过程序中的退出按纽退出,而是直接关闭IE,这样的话,下次登录时数据库里此用户还在线呢,这个用户就无法登录,当然也有一些办法可以解决这个问题:增加一个定时作业,定期复位那些长时间在线的用户,这样又会造成一些问题,如果这个用户实际上就是使用了这么长时间,那就是误杀。

通过多次实验,发现.net本身可以提供这种解决方案。步骤如下:

第一:建立global.asax文件, Session_End 事件中写入如下代码:

             Hashtable h = (Hashtable)Application["online"];
             if (h[Session.SessionID] != null)
                 h.Remove(Session.SessionID);
             Application["online"] = h;

第二:修改web.config文件,在system.web 结点里面增加

<sessionState mode="InProc"></sessionState>

这个是为了使用global.asax中的session_end事件生效。

第三:页面的登录事件中,判断登录用户是否在服务端全局变量中存在,存在就不允许登录,不存在就创建。以下是实现过程,登录按纽的事件中调用。

private void isLogin()
     {
         Hashtable h = (Hashtable)Application["online"];

         if (h == null)
         {
             h = new Hashtable();
         }

         //验证用户是否在Application中存在(是否在线)
         IDictionaryEnumerator e1 = h.GetEnumerator();
         bool flag = false;
         while (e1.MoveNext())
         {
             if (checkCookie(e1.Value.ToString()))
             {
                 flag = true;
                 break;
             }
         }
         if (flag)
         {
             Response.Write("<script defer language='javascript'>alert('This user is online!');history.go(-1);</script>");
         }
         else
         {
             loginLogic login = new loginLogic(this.txt_user_id.Text.Trim(), this.txt_password.Text.Trim());

             if (!login.getLoginStatus)
             {
                 Response.Write("<script defer language='javascript'>alert('Invalid UserID or password.Please try again.');</script>");
             }
             else
             {
                 //生成服务端标识值
                 DateTime now = DateTime.Now;
                 string cookieValue = now.Year.ToString() + now.Month.ToString() + now.Day.ToString() + now.Hour.ToString() + now.Minute.ToString() + now.Second.ToString() + now.Millisecond.ToString();
                 //把userid + 标识值写入全局变量表
                 h[Session.SessionID] = this.txt_user_id.Text.Trim() + "-" + cookieValue;
                 Application["Online"] = h;
                 //把标识值写入客户端cookie
                 Response.Cookies["hqs"].Value =cookieValue;
                 Response.Cookies["hqs"].Expires = DateTime.Now.AddDays(1);

                 //用户信息记入session
                 Session["userid"] = this.txt_user_id.Text.Trim();
                 Response.Redirect("Manage/index.aspx");
             }
         }
     }

private bool checkCookie(string appValue)
     {
         bool isExist = false;

         if (Request.Cookies["hqs"] != null)
         {
             string cookieValue = Request.Cookies["hqs"].Value;

             char[] sp = new char[1]{'-'};
             string appUserid = appValue.Split(sp)[0].ToString();
             string appCookie = appValue.Split(sp)[1].ToString();

             if (appUserid == this.txt_user_id.Text.Trim() && appCookie != cookieValue)
                 isExist = true;
         }
         return isExist;        
     }

注意:在VS2005的内置WEB服务器中测试可能有问题,还在放在IIS的正式环境中去测试.

关于此方案的说明:一般情况下session 的timeout时间为20分钟,也就是说,如果这个用户直接关掉浏览器,然后马上再登录,这个时间session还没有到期,所有不会触发global.asax中的session_end事件,所以会提示这个用户还在线,20分钟后这个事件执行过后,会删掉这个不活动的用户,这时候再登录就正常了。所以不要认为直接关掉IE后,再登录进不去了,就认为这个方案无效。

当然,session 的timeout 时间可以修改的,20分钟不合适可以改。改法如下:

<sessionState mode="InProc" timeout="你认为合适的值"></sessionState>

------------------------

续上篇,现在有新的问题了,如果用户非正常退出那么,session在20分钟内不会执行END事件,也就是说用户还是在线状态,那么此用户再次登录将不被允许。这显然有点不合理。这个方案就显得不够完美了,希望大家补充。

补充:第三步的代码已更新,可以解决这个问题

二、 由于某些原因,在我们的应用中会遇到一个用户只能在一个地方登录的情况,也就是我们通常所说的单点登录。在ASP.NET中实现单点登录其实很简单,下面就把主要的方法和全部代码进行分析。

实现思路

利用Cache的功能,我们把用户的登录信息保存在Cache中,并设置过期时间为Session失效的时间,因此,一旦Session失效,我们的Cache也过期;而Cache对所有的用户都可以访问,因此,用它保存用户信息比数据库来得方便。


程序代码
string sKey = username.Text.ToString().Trim(); // 得到Cache中的给定Key的值
             string sUser = Convert.ToString(Cache[sKey]); // 检查是否存在 
             if (sUser == null || sUser == String.Empty)
             {
                
                 TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);//取得Session的过期时间
                 HttpContext.Current.Cache.Insert(sKey, sKey, null, DateTime.MaxValue, SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable, null);//将值放入cache己方便单点登录
               //成功登录
             }
             else if (Cache[sKey].ToString() == sKey)//如果这个账号已经登录
             {
                 ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('对不起,当前用户已经登录');</script>");
                 return;
             }
             else
             {
                 Session.Abandon();//这段主要是为了避免不必要的错误导致不能登录
             }
Asp.Net 实现简单的单点登录 因最近客户公司一直在讨论单点登录,我个人觉得单点登陆复杂的可以很复杂,简单的可以很简单。 总体来说单点登录,就是提供一个登陆入口,对相关联的系统用户登录进行相关控制,所有的系统登录都有这个入口进入,在使用所有的系统中只要登录一次 就能进入相关系统。(注:我这里所描述的单点登录 只是我个人的理解,不是专业术语 具体请看:点击打开链接)         在演示的demo中 主要分为3个模块 阅读详情

相关推荐

.Net SSO 单点登录方式

访问应用A:打开 https://app1.example.com/Home/Index,由于未登录,自动跳转至 https://app1.example.com/Account/Login。访问应用B:打开 https://app2.example.com/Home/Index,浏览器自动携带 Cookie,应用B解密后直接授权访问。确保应用部署在子域名下(如 app1.example.com、app2.example.com)。应用B:https://app2.company.com(项目管理平台)

Marzlam的博客 1590

.net实现单点登录

一、概念          单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 二、实现机制         当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统(passport)中进行登录;根据用户提供的登录信息,认证系统进行身份效验,如

fengchao1000的专栏 1866

ASP.NET Core+Cookie实现SSO单点登录

简介 我只实现了单点登录,还没有实现单点注销,不过我会在最下面记录单点注销的思路,而单点登录服务端我使用的是Cookie作为全局会话,用Redis代替Session作为存储,我在使用Session作为存储的时候,2个客户端发送Cookie中的Sessionid是一样的,但是服务端却判断Sessionid不一致,最终放弃,改为用Redis,可能是我太菜了= =,如果有人知道这种解决方法,望告知 S...

MDZZ666的博客 6551

.net 下SSO 单点登录的说明

前言: 单点登录,即用户在站点A 登录以后,无需登录 站点 B、站点 C、站点 D 以此类推,往往这些网站都有一个共同的验证中心,下面介绍单点的几种方式 参考:https://blog.csdn.net/xhyxxx/article/details/103267408 前后端分离下单点登录实现的几种方式 1.共享Cookie模式 ①: 即 多个站点公用一个根域名,例如验证中心的地址是 www.Test.com, 那么 实现单点登录的站点必须为子域名,即 aaa.Test.com,bb...

qq_36072399的博客 537

.net单点登录

第一:建立global.asax文件, Session_End 事件中写入如下代码:  复制代码 代码如下: Hashtable h = (Hashtable)Application["online"];  if (h[Session.SessionID] != null)  h.Remove(Session.SessionID);  Application["online"] = h;

ailo555的专栏 450

ASP.NET 单点登录实现教程

通过本教程,我们学习了如何使用 ASP.NET 和 C# 实现一个简单的 ASP.NET 单点登录系统。在本教程中,我们将使用 ASP.NET 和 C# 来实现一个简单的 ASP.NET 单点登录系统。在登录方法中,你可以添加适当的逻辑来验证用户名和密码,并将用户信息存储在会话中。在上述代码中,我们配置了一个默认的控制器和动作,以及一个可选的 ID 参数。在默认页面中,你可以添加其他受保护的功能和页面,确保只有经过身份验证的用户才能访问。上述代码定义了一个简单的登录表单,用户可以输入用户名和密码进行登录。

NoerrorCode的博客 586

.Net单点登录详解 (SSO)

最近做GXP(高校平台)的项目,因为里边有好多个子系统,例如有考试系统,评教系统,基础系统,新生入学系统,权限系统,如果每个系统都有自己的独立的登录的界面,那么就会有能访问这五个系统的人就要记住五套用户名,密码。哇,好累啊,五套!在这个背景下提出了单点登录(SSO)。 先来说说什么是单点登录(SSO),单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方

iBenxiaohai123的博客 1860

UE5音效系统全解析:从Sound Cue到MetaSounds的实战指南

在游戏开发中,音频系统是构建沉浸式体验的关键技术之一。其核心原理在于通过数字信号处理(DSP)和空间音频渲染,模拟真实世界的听觉感知。传统音频管线通常基于静态资源播放与混合,而现代引擎则引入了程序化音频生成与动态调制技术,这极大地提升了音频的互动性与表现力,使其能够实时响应游戏状态变化。这一技术革新对于开发开放世界、VR及3A级游戏尤为重要,它能实现风吹草动皆有不同声响、音效随环境动态变化的细腻效果。本文聚焦虚幻引擎5(UE5)的音效系统,深入剖析其新旧两套核心架构:稳定高效的Sound Cue、Sound

weixin_31179927的博客 331

.net单点登录demo_面试官再问单点登录,把这篇发给他

作者:一叶知秋dwz.cn/d90vKSJE单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来满足需求。我将以我所遇到的应用环境以及在其中所经历的各个阶段与大家分享,若有不足,希望各位不吝赐教。一、共享Session共享Session可谓是实现单点登录最直接、最简单的方...

weixin_39963523的博客 121

基于STM32 FOC下桥三电阻采样方式的电机相电流重构方法

如何提高三电阻采样的调制率

wanrenqi的博客 9197

ubuntu18.04安装Nvidia显卡驱动后黑屏及网络、蓝牙驱动消失的解决方案

ubuntu18.04安装Nvidia显卡驱动后黑屏及网络、蓝牙驱动消失的解决方案

weixin_40735291的博客 6618

.net 单点登录实践

哈喽,欢迎来到小朱课堂,下面开始你的学习吧! .net 单点登录实践 前言   最近轮到我在小组晨会来分享知识点,突然想到单点登录,准备来分享下如何实现单点登录,所以有了下文。实现方案以及代码可能写得不是很严谨,有漏洞的地方或者错误的地方欢迎大家指正。     刚开始头脑中没有思路,直接在博客园里面看看别人是如何来实现的,看了几篇文章发现,发现解决方案有点问题,或者说不算实现了单点登录。 名称定义   为了方便说明先说明几个文中出现的名词的含义:   P站:统一登录授权验证中心,demo中 域名是www.p

weixin_48692664的博客 379

数字孪生驱动的城市地下管网智能运维与应急处置决策支持系统

上海市城市数字化中心的数据实践显示,通过关联分析管网材质与故障率的关系,将铸铁管更换周期从15年优化至8年(李敏,2021)。环境效益方面,上海市通过优化管网运行参数,年减少碳排放1.8万吨,相当于种植36万棵乔木。数字孪生与物理设备的双向交互采用OPC UA协议实现,某次天津管网渗漏事件中,系统通过实时数据反馈,指导现场人员调整注浆方案,将修复时间从48小时压缩至16小时。虚拟指挥沙盘支持多视角协同,深圳水务系统的实践表明,通过AR可视化技术,跨部门会议效率提升60%,方案决策时间缩短40%。

2501_92431686的博客 1424

在ASP.NET 中实现单点登录

在ASP.NET 中实现单点登录出自:【孟宪会之精彩世界】 发布日期:2005年1月27日 8点48分0秒由于某些原因,在我们的应用中会遇到一个用户只能在一个地方登录的情况,也就是我们通常所说的单点登录。在ASP.NET中实现单点登录其实很简单,下面就把主要的方法和全部代码进行分析。 实现思路 利用Cache的功能,我们把用户的登录信息保存在Cache中,并设置过期时间为Session失效的时间,

lohoo的专栏 1014

PaddleOCR GPU部署:从环境配置到避坑实战指南

本文详细介绍了PaddleOCR GPU部署的全过程,从环境配置到避坑实战指南。通过分析常见的部署失败原因,提供硬件兼容性自查、软件环境精配方案以及路径配置的解决方案,帮助用户高效完成GPU加速的OCR任务部署,避免90%的常见错误。

weixin_30839881的博客 418

APS生产排程系统——ERP、MES、APS系统的关联和区别

APS生产排程系统——ERP、MES、APS系统的关联和区别

这里有一只小马吖 2万+

ASP.NET 单点登录

译文原文地址http://www.cnblogs.com/hl13571/archive/2008/01/28/1056671.html 英文原文地址Understanding Single Sign-On in ASP.NET 2.0  理解ASP.NET 2.0中的单点登录Published: 16 Jan 2008摘要 在这篇文章中,Masoud讨论了应用

人在天涯,不倦求索。。 3865

基于单光子探测的高重频多通道符合测距

TDC专栏之基于单光子探测的高重频多通道符合测距

sdau2005的博客 1202

ASP.NET 基于Redis单点登录

  Session介绍     session是用来记录客户端用户信息的,在客户端第一次向服务器发起请求的时候服务器会生成一个sessionid并返回,客户端     接收到seesion存放到cookie中,下次在请求的时候会携带sessionid用于区别不同的客户端   Asp.Net中Session的存储模式        1:InProc,Session存储在进程内,默认值  ...

晓剑 2955

Codex 100个真实案例 - 用AI画业务流程图Mermaid(产品经理都馋哭了)

还在用 Visio、ProcessOn 拖拖拽拽画流程图?改一个箭头方向就要调半天?本案例教你用 Codex 自然语言描述业务流程,AI 自动转为 Mermaid 代码,一秒生成专业流程图、时序图、甘特图、饼图!还能搭建在线渲染工具、批量导出 PNG/SVG、集成到文档系统。产品经理、架构师、项目经理都能用,从此画图再也不是体力活!

yueyeguzhuo的专栏 350

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

.net单点登录demo_面试常问:谈谈项目中单点登录的实现原理?

注:单点登录原理是一个重要知识点,也常被问及,很多童鞋照葫芦画瓢搭建过单点登录,但是被问到原理时可能说不出来,下面简单介绍,抛砖引玉,希望对大家有所帮助。单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来满足需求。我将以我所遇到的应用环境以及在其中所经历的各个阶段与大家...

weixin_31240135的博客 138

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

asp.net项目与开源单点登录项目CAS的结合

这段时间搞的一个asp.net mvc项目,采用了单点登录。这个单点登录就是CAS,一个开源的JAVA项目。当然,这并不影响ASP.NET项目结合它来进行登录。因为各自分工不同:单点登录(管它是不是单点)只负责账户校验,而账户的登录信息读取,以及做何种进一步的处理,那是应用项目自己的事。就好比,单点登录是写字楼的安保。他在核实来访者的来访目的,进行来访者身份登记,通过安检之后,就放来访者进这个大厦了

左直拳的马桶_日用桶 8208

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NET实现单点登录

1.asp.net单点登录(使用的web.config、Machine.config) http://blog.163.com/fgofh_janet/blog/static/1360925882010112292457133/ 2.基于.Net的单点登录(SSO)解决方案(使用认证的方式,借用一个WEB Service的方式,并且有DEMO小例很不错) http://www.cnblogs

码农 1872
上一篇: c#文件流读取编码问题(转)新增加一个方法解决不带BOM的问题
HelloJimmy520
博客等级 码龄16年 31粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值