首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • |500| 公司N个网站要实现单点登录之Cookies设计,大家帮看看可行性和制作流程 分多贴 [已结贴,结贴人:zyciis855]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 10:20:55 楼主
    1:环境
    公司现在有7,8个网站1个PHP,4个ASP,3个.NET
    而且还会继续加多网站
    2:问题
    项目分配单要求:对这些网站要实现用户在某一个网站登录后
    在其他网站都不用再次登录(网站为不同域名,不同服务器)

    我看了网上的一些,基本上可能就只有URL传参和Cookies来保存
    那么我(以.NET为例,如果这个方案可行的话让他们的ASP也改过来)
    用户第一次登录后保存一个Cookies["MyWeb_Key"]
    Cookies["MyWeb_Key"]记录用户的"用户名,用户密码,SessionID"
    然后就在Global中判断Cookies["MyWeb_Key"]
    是否存在
    C# code
    protected void Application_BeginRequest(Object sender, EventArgs e) { //如果Cookies["MyWeb_Key"]存在则进行登录 try { if (Request.Cookies["MyWeb_Key"] != null) { //如果Cookie存在的时候进行解密后取值并进行登录 String[] Keys = Request.Cookies["MyWeb_Key"].Value.Split(','); String username = Keys[0]; String password = Keys[1]; String sessionid = Keys[2]; //判断Sessionid 是否和当前的SessionID相同 //???? 这里的问题是我同一个浏览器 在ASP和ASP.NET中的SessionID会否相同 //???? 如果不同的话这里要如何来验证他们为同一浏览器打开,暂时不考虑PHP,应该想要把他改为.NET if (sessionid == Session.SessionID) { //这里进行用户判断登录 if (true == true) { Session["UserID"] = 1;// true == true表示用户登录成功,“1”表示为取得的用户ID号 //但这里有问题:Application_BeginRequest 会提示出错:会话状态在此上下文中不可用。 //那我的这段各序不写在Application_BeginRequest那要写在什么地方呢 写在pageload? 但这样的话我要改好多基类 } } } else { //如果Cooke不在的话就说明用户已经删除了Cookie 也就是未登录,或注销 //这里进行注销 } } finally { } }
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 10:24:231楼 得分:15
    统一个登陆地方,或者域名, 然后其他网站通过获取参数形式去查看那个登陆的页面,检测是否登陆 如果登陆就ok 没登陆就重新登陆。ss
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 10:25:232楼 得分:0
    上面为什么我用了Cookies还要再去赋值Session呢?
    那是因为本来的网站都是用Session的,所以现在只是做一个添加和删除这个Session的操作
    而不用去改动原来的网站代码
    谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 10:27:343楼 得分:15
    关注
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 10:31:344楼 得分:30
    ①概念:
    单点登录就是同一时刻某一用户只能在一个地点登录系统.
    ②实现
    通过Cache来保证用户只能登录一次.因为Cache是Application level的.
    不过猜想当用户同时在线量很大时会出现问题,10万的用户Cache可不是说着玩的,不过一般除了网游好像很难达到这个数量级.
    ③本文源自【孟宪会之精彩世界】,略做修改,特此感谢!

    HTML code
    <%@ 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>


    C# code
    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) { //字符串倒置 string s="hello_XA"; string ss=""; for(int i=s.Length-1;i>=0;i--) { ss+=s[i]; } Response.Write(ss); Response.Write("<br>"+DateTime.MaxValue+"||"+System.Web.HttpContext.Current.Session.Timeout); // 实际例子可访问: // http://dotnet.aspx.cc/Exam/SingleLogin.aspx } Web 窗体设计器生成的代码#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) { // //Session不能实现单点登录 // string key=UserName.Text + "_" + PassWord.Text; // string k=Convert.ToString(Session["user"]); // if(k==""||k==null) // { // Session["user"]=key; // Response.Write("首次登录!"); // } // else // { // Response.Write("已经登录!"); // } // 作为唯一标识的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构造函数重载版本的方法,是进行是否登录判断的关键。???好象不是哦! //SessTimeOut是设定的一个TimeSpan,该处设定为Session登录超时的时间,我本机为20分钟, //见Page_Load的最后一行输出 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); // 首次登录,您可以做您想做的工作了。 Msg.Text="<h4 style='color:red'>嗨!欢迎您访问<a href='http://dotnet.aspx.cc/'>【孟宪会之精彩世界】"; Msg.Text+="</a>,祝您浏览愉快!:)</h4>"; Msg.Text+="<h4 style='color:red'>AX也祝您愉快!</h4>"; } else { // 在 Cache 中发现该用户的记录,表名已经登录过,禁止再次登录 Msg.Text="<h4 style='color:red'>抱歉,您好像已经登录了呀:-(</h4>"; } } }

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 10:31:595楼 得分:20
    统一用cookie,设置domain


    统一用二级域名,aaa.x.com,bbb.x.com等
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 10:47:446楼 得分:20
    路过,学习一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 11:04:077楼 得分:0

    protected void Application_AcquireRequestState(Object sender, EventArgs s)
    已经可以解决Session会提示出错:会话状态在此上下文中不可用的错误了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 15:01:008楼 得分:0
    无解
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved