千家信息网

如何解决.NET单点登录

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"如何解决.NET单点登录"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!这里指的单点,
千家信息网最后更新 2026年11月03日如何解决.NET单点登录

本篇内容介绍了"如何解决.NET单点登录"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

这里指的单点,泛指在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 结点里面增加

复制代码 代码如下:



这个是为了使用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("");
}
else
{
loginLogic login = new loginLogic(this.txt_user_id.Text.Trim(), this.txt_password.Text.Trim());

if (!login.getLoginStatus)
{
Response.Write("");
}
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分钟不合适可以改。改法如下:



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

现在有新的问题了,如果用户非正常退出那么,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(), "提示", "");
return;
}
else
{
Session.Abandon();//这段主要是为了避免不必要的错误导致不能登录
}

"如何解决.NET单点登录"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

登录 用户 代码 事件 时间 单点 问题 方案 在线 标识 服务 也就是 信息 实际 情况 数据 数据库 也就是说 全局 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 中智农互联网科技 互联网新科技 互联网是第几次科技革命的成果 广州互联网络科技有限公司 美国互联网黑科技 成都狮子座互联网科技 互联网金融科技委员会 美国互联网前沿科技 互联网科技生活的内容 苏州五指互联网络科技有限 崇明区互联网教育科技售后服务 互联网科技与大数据专业 保险科技服务互联网营销体系 35岁以上互联网科技行业 昆明中奇联合互联网科技 互联网科技接地气 长沙易易互联网科技有限公司 北京瑞云互联网科技有限公司 银川新华互联网科技学校招聘 亿人帮互联网科技有限公司 北京路客互联网科技有限公司 广州凡科互联网科技 亿人帮互联网科技 四川狮子座互联网科技 互联网科技公司做什么 区块链结合互联网科技 工业互联网山东科技大学 广州百诚互联网科技有限公司官网 数字互联网科技有限公司
0