.NET(单点登录的设计和实现) .

序:前几天不小心吃饭咬到舌头,发炎,话讲不清楚,吃饭吃不下,大哭,也不想弄其他东西,博文也好几天没有更新,买了点中药,吃了几天舌头好多,想想赶紧把博文补上。这是毕业设计的一篇论文。目的是要实现单点登录的功能。个人理解和实现的单点登录:两个业务系统(业务系统是已经存在的,需要将业务系统融入到当中,如何修改业务系统的代码,下面会有说)A、B,一个认证服务中心SSO。

一开始拿到手,几乎什么思路都没有,然后就上网各种搜索资料,看Demo,看他们说的头头是道,但是到自己实现的时候,却不能达到功能。一次偶然,看到了惠普的一个Demo。链接http://www.ssodemo.com/。用户名和密码都是ssodemo。登录进去看了之后,看到了这个页面,顿时来了点灵感。


这个是某一个用户的对应的表单,我将这个表进行改进


其中IDNum是用来标识用户的唯一ID,SystemID是业务系统的编号。

看一下我的测试数据:第一个Record的涵义就是:IDNum为3200..00的人,在业务系统1里面的用户名是jiwei,密码是1,他在此业务系统中的状态是不在线的。SSO中,需要对用户能够进入某一个业务系统找一个权限进行管理,至于进入业务系统之后的跳转和SSO无关。


这个是单点登录中不同用户的登录和注销的过程。对于普通用户,如果从业务系统A登录,那么将Username和Password在SSO进行认证,成功之后,返回到原来的业务系统A中,然后实现具体的操作,当然,用户也可以直接从SSO登录,这个时候,则返回用户的一个业务系统的列表。

在BizSystem表中,记录着业务系统的相关信息。


下面是各个字段的字段名、字段类型、说明。


下面是具体的一个流程图。


用户访问业务系统,检查用户的状态(Session),如果用户已经登录,那么则进行访问,如果尚未登录,那么就跳转到业务系统的登录界面。(这边我实现了一个额外的功能,那就是如果用户某一段时间已经登录过其他的业务系统,即用户在SSO中进行过了验证,那么这个时候,就把登录界面的Username和Password进行自动的填写)将Username和Password递交到SSO进行验证,同时递交的还有EncryKey密钥,当时是出于安全性的考虑,在业务系统和SSO中都记录了某一个业务系统的一个密钥或者叫KEY,就是标识业务系统的唯一ID。然后按照流程图一步一步的走。

差不多逻辑想好,就要开始Coding了。


将刚刚说到的各表都设计成实体类,其中涉及到外键约束的可以看我的另外一个帖子。数据库文件设计了SQL-Server、XML(主要是一些配置信息的存放)、Excel(用户的导入导出等)。

这个里面最核心的就是跨域的传值了,网络上也有好多方法,这边我讲一个我自己的方法。

首先说一下为什么要跨域传值,比方说这个时候,用户【张三】登录了业务系统【A】,那么这个时候用户的部分信息是用Cookie存放的,虽然Cookie技术是一个浏览器端的技术,但是Cookie是有自己的作用范围的。具体可以看看博客园的几篇帖子。

地址1:http://www.cnblogs.com/lingyi/archive/2012/03/01/2375581.html

地址2:http://www.cnblogs.com/youring2/archive/2012/03/25/2416954.html

说白了就是,如果【张三】这个时候需要登录业务系统【B】,但是【A】和【B】又不在同一个域或者是顶级域和子域名的关系,那么这个时候,Cookie是不能实现共享的。那我想到的是,利用SSO这个系统来进行一个过渡,【张三】在SSO中设置的Cookie,再从SSO中读出来那是可以的。

第二:利用Iframe来实现跨域的传值。下面分别是RedCookieWriteCookie的代码。

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7.   
  8. namespace SSO.Web  
  9. {  
  10.     public partial class RedCookie : System.Web.UI.Page  
  11.     {  
  12.         private static string url = "";  
  13.         protected void Page_Load(object sender, EventArgs e)  
  14.         {  
  15.             if (Request.QueryString["URL"] != null)  
  16.             {  
  17.                 url = Request.QueryString["URL"].ToString();  
  18.             }  
  19.             else  
  20.             {  
  21.                 url = "";  
  22.             }  
  23.         }  
  24.   
  25.         protected string GetIDNum()  
  26.         {  
  27.             //Request.Cookies["IDNum"].Value = "320000000000000000";   
  28.             if (Request.Cookies["IDNum"] != null)  
  29.             {  
  30.                 return Server.HtmlEncode(Request.Cookies["IDNum"].Value);  
  31.             }  
  32.             else {  
  33.                 return "0";  
  34.             }  
  35.         }  
  36.   
  37.         protected string GetURL()  
  38.         {  
  39.             return url;  
  40.         }  
  41.     }  
  42. }  
  43.   
  44.   
  45. using System;  
  46. using System.Collections.Generic;  
  47. using System.Linq;  
  48. using System.Web;  
  49. using System.Web.UI;  
  50. using System.Web.UI.WebControls;  
  51.   
  52. namespace SSO.Web  
  53. {  
  54.     public partial class WriteCookie : System.Web.UI.Page  
  55.     {  
  56.         protected void Page_Load(object sender, EventArgs e)  
  57.         {  
  58.   
  59.         }  
  60.   
  61.         protected void SetCookie(string idnum) {   
  62.               
  63.         }  
  64.   
  65.         /// <summary>   
  66.         /// 得到用户的身份证号码,当业务系统在SSO中验证通过之后   
  67.         /// 同时,SSO中,讲用户的IDNum写入到Cookie当中   
  68.         /// 这个Cookie是写在SSO当中的,则避免了Cookie的跨域访问。   
  69.         /// </summary>   
  70.         /// <returns></returns>   
  71.         protected string GetIDNum()  
  72.         {  
  73.             string idnum = "";  
  74.             if (Request.QueryString["IDNum"] == null)  
  75.             {  
  76.                 return idnum;  
  77.             }  
  78.             else  
  79.             {  
  80.                 idnum = Request.QueryString["IDNum"].ToString();  
  81.                 return idnum;  
  82.             }  
  83.   
  84.         }  
  85.   
  86.         /// <summary>   
  87.         /// 根据请求的URI来判断是否是来自于合法的业务系统的合法请求   
  88.         /// </summary>   
  89.         /// <param name="uri"></param>   
  90.         /// <returns></returns>   
  91.         protected bool ValidateBizSystem(string uri)  
  92.         {  
  93.             return true;  
  94.         }  
  95.     }  
  96. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SSO.Web
{
    public partial class RedCookie : System.Web.UI.Page
    {
        private static string url = "";
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["URL"] != null)
            {
                url = Request.QueryString["URL"].ToString();
            }
            else
            {
                url = "";
            }
        }

        protected string GetIDNum()
        {
            //Request.Cookies["IDNum"].Value = "320000000000000000";
            if (Request.Cookies["IDNum"] != null)
            {
                return Server.HtmlEncode(Request.Cookies["IDNum"].Value);
            }
            else {
                return "0";
            }
        }

        protected string GetURL()
        {
            return url;
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SSO.Web
{
    public partial class WriteCookie : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void SetCookie(string idnum) { 
            
        }

        /// <summary>
        /// 得到用户的身份证号码,当业务系统在SSO中验证通过之后
        /// 同时,SSO中,讲用户的IDNum写入到Cookie当中
        /// 这个Cookie是写在SSO当中的,则避免了Cookie的跨域访问。
        /// </summary>
        /// <returns></returns>
        protected string GetIDNum()
        {
            string idnum = "";
            if (Request.QueryString["IDNum"] == null)
            {
                return idnum;
            }
            else
            {
                idnum = Request.QueryString["IDNum"].ToString();
                return idnum;
            }

        }

        /// <summary>
        /// 根据请求的URI来判断是否是来自于合法的业务系统的合法请求
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        protected bool ValidateBizSystem(string uri)
        {
            return true;
        }
    }
}

  1.   
 
 

系统我已经测试通过。

新手上路,希望多多指教。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值