在asp.net 中实现单点登录
由于某些原因,在我们的应用中会遇到一个用户只能在一个地方登录的情况,也就是我们通常所说的单点登录。在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">
<meta http-equiv="author" content="孟子e章">
<meta http-equiv="website" content="http://dotnet.aspx.cc/">
<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)
{
// 实际例子可访问:
// http://dotnet.aspx.cc/exam/singlelogin.aspx
}
#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://dotnet.aspx.cc/>【孟宪会之精彩世界】";
msg.text += "</a>,祝您浏览愉快!:)</h4>";
}
else
{
// 在 cache 中发现该用户的记录,表名已经登录过,禁止再次登录
msg.text="<h4 style=color:red>抱歉,您好像已经登录了呀:-(</h4>";
return;
}
}
}
}