zoukankan      html  css  js  c++  java
  • 应用系统接入接口开发

    根据上面的接口交互描述,我们可以看到,应用系统要接入单点登录系统,实现通行证机制,主要要实现以下接口功能。

    用户身份认证

    检查用户是否为合法用户,否则,向Service认证中心发送认证请求。

    这里用了一个页面基类来实现身份验证的功能,所有需要做验证的页面,只需要继承该类即可,当然,也可以用这个代码实现一个用户自定义控件,放到需要做验证的页面上即可。


    //<summary>

    //====================

    //应用系统验证(页面)的基类

    //====================

    //</summary>

    publicclass ValidatePageBase : System.Web.UI.Page

    {

        protected override void OnInit(EventArgs e)

        {

            base.OnInit(e);

            CustomerValidate();

        }

        public void CustomerValidate()

    {

          bool Pass =(bool)Session["Pass"];//当前状态

          if (!Pass)

          {

                string Security =Assistant.GetSecurity();//安全码

                Session["Security"] =Security;

                Session["ReturnUrl"] =Request.RawUrl;//要访问的页面    

                //分配给当前应用系统的API代码

                string apikey =Assistant.GetConfigString("apikey");

                //认证服务器验证地址

                string posturl =Assistant.GetConfigString("ServiceValidate");

                posturl = UrlOper.AddParam(posturl,"apikey", apikey);

                posturl = UrlOper.AddParam(posturl,"security", Security);

                //向认证服务器发送验证请求

                Response.Redirect(posturl);

          }

    }   

    }

    接收状态同步

    在认证服务器确认用户身份通过后,调用该接口更新当前应用系统用户状态。应用系统接收这些参数,进行校验处理后,更新本地的用户状态。


    //<summary>

    //====================

    // (接收)状态同步页面的基类

    //====================

    //</summary>

    publicclass SynPageBase : System.Web.UI.Page

    {

        #region 获取参数

        // <summary>

        // 接收本地应用系统的UserName

        // </summary>

        public virtual string InUserName

        {

            get

            {

                if ((Request["un"] !=null) && (Request["un"].ToString() != ""))

                {

                    returnRequest["un"].Trim();

                }

                return "";

            }

        }

        // <summary>

        // 接收登录标志Pass

        // </summary>

        public virtual string InPass

        {

            get

            {

                if ((Request["pass"] !=null) && (Request["pass"].ToString() != ""))

                {

                    returnRequest["pass"].Trim();

                }

                return "";

            }

        }

        // <summary>

        // 接收安全码Security

        // </summary>

        public virtual string InSecurity

        {

            get

            {

                if ((Request["security"]!= null) &&

                    (Request["security"].ToString()!= ""))

                {

                    returnRequest["security"].Trim();

                }

                return "";

            }

        }

        #endregion

        protected override void OnInit(EventArgs e)

        {

            base.OnInit(e);

            CustomerValidate();

        }

        protected virtual void CustomerValidate()

        {

            string Security =Session["Security"].ToString();

            if (Security != "")

            {

                //安全码校验是否一致

                if(Assistant.HashEncoding(Security) == InSecurity)

                {

                    if (InPass.ToLower() =="true") //登录状态是否登录

                    {

                        ////////根据InUserName,进行直接登录///////////

                       //FormsAuthentication.SetAuthCookie(InUserName, false);

                       Session["UserName"] = InUserName;

                        Session["Pass"] =true;

                       ///////////////////////////////////////////////

                        //返回认证前要访问的地址

                       Response.Redirect(Session["ReturnUrl"].ToString());

                    }

                }

                else //请求和应答的安全码是不匹配的

                {

                    Response.Write("数据不一致错误!");

                }

            }

            else

            {

                if (Session["ReturnUrl"]!= null &&

                    Session["ReturnUrl"].ToString()!= "")

                {

                   Response.Redirect(Session["ReturnUrl"].ToString());

                }

               Response.Redirect("index.aspx");

            }

        }      

    }

    用户注销

    通过执行Logout.aspx页面,实现退出当前应用系统的登录。认证服务中心注销时即调用该页面。

    publicpartial class Logout : System.Web.UI.Page

    {

        protected override void OnInit(EventArgs e)

        {

            base.OnInit(e);

            ClearSession();

        }

        private void ClearSession()

        {

            Session.Clear();

            Session.Abandon();       

        }

    }

    需要说明的是,只退出当前应用的登录是不起作用的,需要把Service认证中心的登录信息注销才可以。若要注销所有应用中的登录信息,只需要转到Service认证中心的注销页即可。例如:

    Response.Redirect(ConfigurationSettings.AppSettings["ServiceUrl"]+

      "/logout.aspx");

    更新认证服务器状态

    我们知道,页面在一段时间内不刷新,Session就会超时失效,在我们一直访问应用系统(如Blog或BBS)的时候,怎么才能保证Service的Session不会失效呢?很简单,我们可以通过不断调用Service认证服务器的页面来保持Session有效。通过在应用系统(如Blog或BBS)所有的页面内都用<iframe>的方式嵌套Service认证服务器的某个页面,就能保证Service和应用系统(如Blog或BBS)的页面同时刷新。需要注意的一点是,Service的Session必须大于所有应用系统(如Blog或BBS)的Session超时时间,这个可以在Web.config里进行配置。

    我们可以用这段<iframe>代码实现一个用户控件方式,放到所有的页面会更容易维护。页面代码如下:

    <%@ Control Language="C#"AutoEventWireup="true" CodeBehind=

          "SynServerIFrame.ascx.cs"Inherits="Blog.SynServerIFrame" %>

    <iframewidth=0 height=0 src='<%=ServiceUrl%>/SessionState.aspx'></iframe>

    C#代码如下:

    publicpartial class SynServerIFrame : System.Web.UI.UserControl

    {

        public string ServiceUrl=ConfigurationSettings.AppSettings["ServiceUrl"];

    }

    通过实现以上接口和代码,我们的应用系统就已经支持单点登录功能了。我们可以运行测试,直接访问应用系统的页面,会自动转到Service认证服务器进行登录。一旦登录成功,则访问任何一个系统System内的应用系统都将不再需要任何登录,并且不管有多少个网站应用,只要这些网站系统都符合接口标准,则这些网站就都能保持Service的用户状态,同时能通过Service获得用户的状态,而不需要再登录。也就是说,我们实现了SSO(单点登录)。

     

    本文节选自《项目中的.NET》一书

    李天平 编著

    电子工业出版社出版

  • 相关阅读:
    矩阵图
    博客园评价
    团队冲刺
    团队冲刺
    第二阶段团队冲刺
    团队博客
    团队冲刺
    总结会议
    会议10
    会议09
  • 原文地址:https://www.cnblogs.com/broadview/p/2734843.html
Copyright © 2011-2022 走看看