欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在ASP.NET 中实现单点登录

程序员文章站 2023-11-27 12:42:46
出自:【孟宪会之精彩世界】 发布日期:2005年1月27日 8点48分0秒 [有删改]  由于某些原因,在我们的应用中会遇到一个用户...

出自:【孟宪会之精彩世界】 发布日期:2005年1月27日 8点48分0秒 [有删改] 
由于某些原因,在我们的应用中会遇到一个用户只能在一个地方登录的情况,也就是我们通常所说的单点登录。在asp.net中实现单点登录其实很简单,下面就把主要的方法和全部代码进行分析。  
实现思路  
利用cache的功能,我们把用户的登录信息保存在cache中,并设置过期时间为session失效的时间,因此,一旦session失效,我们的cache也过期;而cache对所有的用户都可以访问,因此,用它保存用户信息比数据库来得方便。  
singlelogin.aspx代码  
<%@ page language="c#" codebehind="singlelogin.aspx.cs" autoeventwireup="false" 
 inherits="emeng.exam.singlelogin" %> 
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" > 
<html> 
<head> 
<title>单点登录测试</title> 
<meta http-equiv="content-type" content="text/html; charset=gb2312"> 
<style> 
h3 { font: 17px 宋体 } 
input { font: 12px 宋体 } 
span { font: 12px 宋体 } 
p { font: 12px 宋体 } 
h4 { font: 12px 宋体 } 
</style> 
</head> 
<body ms_positioning="gridlayout"> 
<form id="form1" method="post" runat="server"> 
  <div align="center"> 
    <h3>单点登录测试</h3> 
    <p>用户名称:<asp:textbox id="username" runat="server"></asp:textbox></p> 
    <p>用户密码:<asp:textbox id="password" runat="server" textmode="password"></asp:textbox></p> 
    <p><asp:button id="login" runat="server" text=" 登  录 "></asp:button></p> 
    <p><asp:label id="msg" runat="server"></asp:label></p> 
  </div> 
</form> 
</body> 
</html>  
singlelogin.aspx.cs代码  
using system; 
using system.collections; 
using system.componentmodel; 
using system.data; 
using system.drawing; 
using system.web; 
using system.web.sessionstate; 
using system.web.ui; 
using system.web.ui.webcontrols; 
using system.web.ui.htmlcontrols;  
namespace emeng.exam 

/// <summary> 
/// singlelogin 的摘要说明。 
/// 实现单点登录 
/// </summary> 
public class singlelogin : system.web.ui.page 

protected system.web.ui.webcontrols.textbox username; 
protected system.web.ui.webcontrols.textbox password; 
protected system.web.ui.webcontrols.label msg; 
protected system.web.ui.webcontrols.button login;  
private void page_load(object sender, system.eventargs e) 

}  
#region web 窗体设计器生成的代码 
override protected void oninit(eventargs e) 

  initializecomponent(); 
  base.oninit(e); 
}  
/// <summary> 
/// 设计器支持所需的方法 - 不要使用代码编辑器修改 
/// 此方法的内容。 
/// </summary> 
private void initializecomponent() 

  this.login.click += new system.eventhandler(this.login_click); 
  this.load += new system.eventhandler(this.page_load); 

#endregion  
private void login_click(object sender, system.eventargs e) 

  // 作为唯一标识的key,应该是唯一的,这可根据需要自己设定规则。 
  // 做为测试,这里用用户名和密码的组合来做标识;也不进行其它的错误检查。  
  // 生成key 
  string skey = username.text + "_" + password.text; 
  // 得到cache中的给定key的值 
  string suser = convert.tostring(cache[skey]); 
  // 检查是否存在 
  if (suser == null || suser == string.empty) 
  { 
    // cache中没有该key的项目,表名用户没有登录,或者已经登录超时 
    // 注意下面使用的timespan构造函数重载版本的方法,是进行是否登录判断的关键。 
    timespan sesstimeout = new timespan(0,0,system.web.httpcontext.current.session.timeout,0,0); 
    httpcontext.current.cache.insert(skey,skey,null,datetime.maxvalue,sesstimeout, 
      system.web.caching.cacheitempriority.notremovable,null); 
    session["user"] = skey; 
    // 首次登录,您可以做您想做的工作了。 
    msg.text="<h4 style='color:red'>嗨!欢迎您访问<a href='http://www.21asp.net/'>www.21asp.net"; 
    msg.text += "</a>,祝您浏览愉快!:)</h4>"; 
  } 
  else 
  { 
    // 在 cache 中发现该用户的记录,表名已经登录过,禁止再次登录 
    msg.text="<h4 style='color:red'>抱歉,您好像已经登录了呀:-(</h4>"; 
   return; 
  } 


}