单点登录2

2.主站的webservice服务

using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;


namespace SSO.Passport
{
    /// <summary>
    /// 主站WEB服务
    /// DEMO仅进行演示,正式布署请对接口添加安全验证
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    public class TokenService : System.Web.Services.WebService
    {
        /// <summary>
        /// 根据令牌获取用户凭证
        /// </summary>
        /// <param name="tokenValue">令牌</param>
        /// <returns></returns>
        [WebMethod]
        public object TokenGetCredence(string tokenValue)
        {
            object o = null;


            DataTable dt = Passport.Class.CacheManager.GetCacheTable();
            if (dt != null)
            {
                DataRow[] dr = dt.Select("token = '" + tokenValue + "'");
                if (dr.Length > 0)
                {
                    o = dr[0]["info"];
                }
            }


            return o;
        }


        /// <summary>
        /// 清除令牌
        /// </summary>
        /// <param name="tokenValue">令牌</param>
        [WebMethod]
        public void ClearToken(string tokenValue)
        {
            DataTable dt = Passport.Class.CacheManager.GetCacheTable();
            if (dt != null)
            {
                DataRow[] dr = dt.Select("token = '" + tokenValue + "'");
                if (dr.Length > 0)
                {
                    dt.Rows.Remove(dr[0]);
                }
            }
        }


    }//end class
}



3,主站保存登录信息的cache方法

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;


namespace SSO.Passport.Class
{
    /// <summary>
    /// 缓存管理
    /// 将用户凭证、令牌的关系数据存放于Cache中
    /// </summary>
    public class CacheManager
    {
        /// <summary>
        /// 获取缓存中的DataTable
        /// </summary>
        /// <returns></returns>
        public static DataTable GetCacheTable()
        {
            DataTable dt = null;
            if (HttpContext.Current.Cache["CERT"] != null)
            {
                dt = (DataTable)HttpContext.Current.Cache["CERT"];
            }
            return dt;
        }


        /// <summary>
        /// 初始化数据结构
        /// </summary>
        /// <remarks>
        /// ----------------------------------------------------
        /// | token(令牌) | info(用户凭证) | timeout(过期时间) |
        /// |--------------------------------------------------|
        /// </remarks>
        private static void cacheInit()
        {
            if (HttpContext.Current.Cache["CERT"] == null)
            {
                DataTable dt = new DataTable();


                dt.Columns.Add("token", Type.GetType("System.String"));
                dt.Columns["token"].Unique = true;


                dt.Columns.Add("info", Type.GetType("System.Object"));
                dt.Columns["info"].DefaultValue = null;


                dt.Columns.Add("timeout", Type.GetType("System.DateTime"));
                dt.Columns["timeout"].DefaultValue = DateTime.Now.AddMinutes(double.Parse(System.Configuration.ConfigurationManager.AppSettings["timeout"]));


                DataColumn[] keys = new DataColumn[1];
                keys[0] = dt.Columns["token"];
                dt.PrimaryKey = keys;


                //Cache的过期时间为 令牌过期时间*2
                HttpContext.Current.Cache.Insert("CERT", dt, null, DateTime.MaxValue, TimeSpan.FromMinutes(double.Parse(System.Configuration.ConfigurationManager.AppSettings["timeout"]) * 2));
            }
        }


        /// <summary>
        /// 判断令牌是否存在
        /// </summary>
        /// <param name="token">令牌</param>
        /// <returns></returns>
        public static bool TokenIsExist(string token)
        {
            cacheInit();


            DataTable dt = (DataTable)HttpContext.Current.Cache["CERT"];
            if (dt.Select("token = '" + token + "'").Length == 0)
                return false;
            else
                return true;
        }


        /// <summary>
        /// 更新令牌过期时间
        /// </summary>
        /// <param name="token">令牌</param>
        /// <param name="time">过期时间</param>
        public static void TokenTimeUpdate(string token, DateTime time)
        {
            cacheInit();


            DataTable dt = (DataTable)HttpContext.Current.Cache["CERT"];
            DataRow[] dr = dt.Select("token = '" + token + "'");
            if (dr.Length > 0)
            {
                dr[0]["timeout"] = time;
            }
        }


        /// <summary>
        /// 添加令牌
        /// </summary>
        /// <param name="token">令牌</param>
        /// <param name="info">凭证</param>
        /// <param name="timeout">过期时间</param>
        public static void TokenInsert(string token, object info, DateTime timeout)
        {
            cacheInit();


            if (!TokenIsExist(token))
            {
                DataTable dt = (DataTable)HttpContext.Current.Cache["CERT"];
                DataRow dr = dt.NewRow();
                dr["token"] = token;
                dr["info"] = info;
                dr["timeout"] = timeout;
                dt.Rows.Add(dr);
                HttpContext.Current.Cache["CERT"] = dt;
            }
            else
            {
                TokenTimeUpdate(token, timeout);
            }
        }


    }//end class
}

SSO(Single sign-on)即单点登录技术。它是指在多个子系统的大型应用中,用户在子系统之间进行切换时,不需要每次都重新输入用户的身份信息,从而做到一处认证,整个应用系统都能有效识别。单点登录技术的系统集成功能为当前企事业单位尤其是大型多子系统企业系统集成提供了完美的解决方案。它使得这些原有系统能够合理的集成起来,对外提供统一的界面风格和唯一的登录入口。单点登录只是一种功能概念,并没有对具体的实现方式进行定义和限制。NC-Portal的单点登录方案,就是SSO技术的一种实现方式。 NC-Portal的SSO方案是基于凭证的思想设计。对于NC-Portal集成的每个第三方系统都有一个制作凭证的页面,该页面用于当前登录的portal用户输入对应的第三方系统的用户信息,在正常情况下,该制作凭证的页面最多出现一次。当用户输入的第三方系统登录信息进行验证后,会自动在portal系统的数据库中建立一对凭证槽和凭证信息,这对信息记录了portal用户在特定的portal布局和特定的portlet下,与该第三方系统的身份对应关系。当该用户之后登录portal并进入被集成第三方系统时,portal系统负责获取之前成功建立的对应第三方系统身份信息,并用该身份信息进行第三方系统的身份认证。这一切的操作对当前登录用户来说都是透明的,他们看到的是没有输入任何身份信息而以正确的身份进入了第三方系统。另外,在用户每次登录第三方系统时,都会根据第三方系统的要求进行身份认证,因此这个登录过程是安全的。 对于NC-Portal来说,对Web系统的集成提供了完善的支持和解决,对Web系统的集成,目前有大小之分。集成一个单独的系统如NC、IUFO、BO、OA系统采用单独的一个布局存放(当然,该布局也是由一个portlet组成),这些Web系统称为“大”系统。另外,还存在一些集成第三方系统的“小”portlet,如NC待办事务Portlet、NC报表Portlet、IUFO报表Portlet等,这些是以“小”Portlet的形式出现的。他们主要提供一些对集成系统的辅助功能,如对NC待办事务的提取、对IUFO报表信息的提取,这两种方式功能侧重点略有不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值