怎样实现单点登录?
各位大虾。我想了很久也不明白,希望能有朋友指点迷津。
=====================================================
就是在域里面,同一时间,只能有一个帐号登录,也就是说,一个帐号正在使用,别人就不能使用。
问题点数:100、回复次数:13Top
1 楼wls12342004(青青子木)回复于 2005-06-01 10:17:46 得分 0
upTop
2 楼3tzjq(永不言弃)回复于 2005-06-01 10:19:08 得分 30
我是这样解决的:
用户数据表:users 添加个字段:在线状态 bit
然后当某用户登录成功后,随便更新'在线状态'=1,注销时更新'在线状态'=0,
其它计算机用户登录时,判断当前用户的'在线状态',为1时就不允许登录。Top
3 楼3tzjq(永不言弃)回复于 2005-06-01 10:19:40 得分 0
随便 >> 顺便Top
4 楼zhongwanli(㊣【为了老婆,二次重构____然后升★★】㊣)回复于 2005-06-01 10:26:00 得分 10
楼上的解决方案可以。
不过,我想应该有其他的。
只是我还不知道。Top
5 楼time_is_life(今夜太冷:http://timeislife.blog.sohu.com)回复于 2005-06-01 10:26:09 得分 0
楼主说的情况根本不是单点登录,不要乱用概念
http://www.microsoft.com/china/msdn/library/webservices/asp.net/singlesignon.mspx
Top
6 楼zhongwanli(㊣【为了老婆,二次重构____然后升★★】㊣)回复于 2005-06-01 10:26:18 得分 0
帮楼主顶一下Top
7 楼wh8254(租个老婆结婚~~)回复于 2005-06-01 10:33:06 得分 10
如果是b/s的程序,如果不在数据库中设一个字段来标记的话,是没有办法控制的Top
8 楼khpcg(欢乐英雄)回复于 2005-06-01 10:59:27 得分 10
单点登陆好象是说一次登陆的意思啊,这里说的好象是只能有一个用户登陆啊Top
9 楼time_is_life(今夜太冷:http://timeislife.blog.sohu.com)回复于 2005-06-01 11:02:39 得分 40
用数据表实时性不是很好,要总刷新,数据库压力大
如果程序出错,比如操作数据库失败,就不准确了
用Application比较好,但是频繁操作Application会对网站的性能有影响
最好的办法就是设置一个静态变量
asp.net的静态变量就是为了干这个的
因为静态变量是类的全部实例共享的
我用这种方法写了一段代码,这段代码是适用于windows验证的情况,代码编译通过,我没有测试,但是道理是这样的。
-------------------------------------------------------------------------------
1. 定义一个通用类
using System;
using System.Collections;
namespace Web
{
/// <summary>
/// CheckUserLogon 的摘要说明。
/// </summary>
public class CheckUserLogon
{
public static Hashtable userList = new Hashtable();
public CheckUserLogon()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static void AddUserList( string user )
{
userList.Add( user , "online" );
}
public static void RemoveUserList( string user )
{
userList.Remove( user );
}
public static bool CheckUserLogined( string user )
{
if ( userList.ContainsKey( user ) )
{
return true;
}
else
{
return false;
}
}
}
}
2.在Global.asax中修改session_start()和session_end()
protected void Session_Start(Object sender, EventArgs e)
{
if ( CheckUserLogon.CheckUserLogined( this.User.Identity.ToString() ) )
{ //如果已经有同名用户登录,就清空session,这样用户就不能使用
this.Session.Clear();
}
else
{ //如果没有同名用户登录,就记录当前用户
CheckUserLogon.AddUserList( this.User.Identity.ToString() );
}
}
protected void Session_End(Object sender, EventArgs e)
{
CheckUserLogon.RemoveUserList ( this.User.Identity.ToString() );
}
Top
10 楼time_is_life(今夜太冷:http://timeislife.blog.sohu.com)回复于 2005-06-01 11:07:33 得分 0
当然也可以这样写:
if ( CheckUserLogon.CheckUserLogined( this.User.Identity.ToString() ) )
{ //转到另一个页面,这里提示用户已经有同名用户登录
this.Response.Redirect("aaa.aspx")
}
else
{ //如果没有同名用户登录,就记录当前用户
CheckUserLogon.AddUserList( this.User.Identity.ToString() );
}Top
11 楼cndsn(磐石)回复于 2005-06-01 11:17:26 得分 0
对!不要乱来,什么单点登陆都不理解,吓吹,
单点登陆(SSO),多个系统一次登陆权限均配,
彼此访问无需要再次登陆!
大多都是用webservice实现令牌传递,跨系统,跨平台的权限验证。Top
12 楼meixiaofeng(yesmsn)回复于 2005-06-01 11:18:06 得分 0
还要设置多长时间去读一下机器,万一死机Top
13 楼COpyFRee(NULL)回复于 2005-06-01 12:34:41 得分 0
看了标题进来,结果是文不对题!Top




