单点登录

流程:

1、用户访问首页,调用回调函数,单点返回用户信息

    $(function () {
        $.getScript("https://cas.t.nxin.com/cas/v1/tickets/loginApi");
    })
    function loginApi(resp) {
        if (resp.name) {
            $(".ylm_enter").html("<span class='hello'>" + resp.name + ",你好!</span> <a href='/Main/Index'>进入我的渔联网</a><a href='/Home/LogOff'>退出</a>");
        }
        else {
            if (resp.loginName) {
                $(".ylm_enter").html("<span class='hello'>" + resp.loginName + ",你好! </span><a href='/Main/Index'>进入我的渔联网</a><a href='/Home/LogOff'>退出</a>");
            }
        }
    };

2、访问业务页面

 

[CheckLogin]
        public ActionResult Page1()
        {
            return View();
        }

CheckLogin

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using WebApplication1.Controllers;

namespace WebApplication1.Filters
{
    public class CheckLoginAttribute:ActionFilterAttribute
    {
        //实例化 Controller
        HomeController account = new HomeController();
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            bool isAjax = filterContext.HttpContext.Request.IsAjaxRequest();//判断是否是Ajax请求
            account.RequestCas_SessionHandle(filterContext.HttpContext as HttpContextWrapper);
            //filterContext.HttpContext.Session["bo_id"] = null;//测试用
            Object boId = filterContext.HttpContext.Session["bo_id"];
            if (boId != null && boId.ToString().Length > 0)//用户名存在
            {
                return;//SessionOk
            }

            if (!isAjax)
            {//普通请求
                //return RedirectToRouteResult("/Account/Login");
                if (boId != null && boId.ToString().Length > 0)
                {
                    return;//SessionOk
                }
                else
                {//跳转到登陆页面
                    filterContext.Result = new RedirectToRouteResult(
                                            "Default",
                                            new RouteValueDictionary(
                                                    new
                                                    {
                                                        controller = "Home",
                                                        action = "Login"
                                                    })
                                            );
                }
            }
            boId = filterContext.HttpContext.Session["bo_id"];
            if (boId != null && boId.ToString().Length > 0)
            {
                return;//SessionOk
            }
            AjaxRequestDeny(filterContext);//cas和session都过期的ajax请求
        }

        /// <summary>
        /// 处理cas和session都过期的ajax请求
        /// </summary>
        /// <param name="filterContext"></param>
        private void AjaxRequestDeny(ActionExecutingContext filterContext)
        {
            //删除智农网首页使用的cookie
            HttpCookie cookie = filterContext.HttpContext.Request.Cookies["casCookie"];
            if (cookie != null)
            {
                cookie.Domain = "dbn.cn";//设置cookie跨域
                cookie.Path = "/";//设置cookie保存路径,根目录
                cookie.Expires = DateTime.Now.AddMinutes(-30);//设置为过期
                filterContext.HttpContext.Response.Cookies.Add(cookie);
            }
            //删除猪联网首页使用的cookie
            HttpCookie cookie2 = filterContext.HttpContext.Request.Cookies["pigCookie"];
            if (cookie2 != null)
            {
                //cookie.Domain = "dbn.cn";
                cookie2.Path = "/";
                cookie2.Expires = DateTime.Now.AddMinutes(-30);
                filterContext.HttpContext.Response.Cookies.Add(cookie2);
            }
            filterContext.HttpContext.Response.AddHeader("DBN-session-timeout", "true");
        }
    }
}

HomeController方法

/// <summary>
        /// 提供给过滤器,让其调用 - Session过期时,访问单点
        /// </summary>
        public void RequestCas_SessionHandle(HttpContextWrapper _context)
        {
            //从用户中心获取数据
            CasPrincipal cas = _context.User as CasPrincipal;//猜测:根据cookie中的标识符,访问用户中心获取登陆信息


            string boid = string.Empty;
            string userName = string.Empty;
            string loginName = string.Empty;
            string userType = string.Empty;
            string phone = string.Empty;

            if (cas == null)
            {
                return;
            }

            //读取单点数据
            loginName = cas.Identity.Name;
            boid = cas.Assertion.RawAttributes["boId"];
            userType = cas.Assertion.RawAttributes["userType"];//1代表是外部用户(非大北农员工),0代表是内部用户

            //WisdomFish.Common.LogHelper.WriteLog("loginName:" + loginName + "     boid:" + boid);
            try
            {
                userName = cas.Assertion.RawAttributes["name"];
            }
            catch (Exception)
            {
            }
            try
            {
                phone = cas.Assertion.RawAttributes["phone"];
                _context.Session["phone"] = phone;
            }
            catch (Exception)
            {
            }
            _context.Session["userName"] = userName;
            if (!string.IsNullOrEmpty(boid))
            {
                _context.Session["bo_id"] = boid;
                _context.Session["userType"] = userType;
                _context.Session["loginName"] = loginName;//进销财登录时 loginName 无值,故加上

                LoginInfo.UserID = boid;
                LoginInfo.UserTicket = loginName; //登录名
                LoginInfo.PersonName = userName; //用户姓名
            }
            else
            {
                return;
            }

        }

 

 3、登陆

登录form

<form action="@ViewBag.CasLoginUrl" id="login" method="post">
                            <input type="hidden" name="password" id="password2" />
                            <input type="hidden" name="systemId" value="10" />
                            <input name="service" type="hidden" value="@ViewBag.LoginTo" />
                            <input type="hidden" name="loginTicket" />
                            <input name="login_from" type="hidden" value="@ViewBag.LoginFrom" />

                            <div class="lg_del">
                                <p><input type="text" id="username" name="username" placeholder="用户名" /></p>
                                <p><input type="password" id="password" placeholder="密码" /></p>
                                <p class="t_right fpwd"><a id="regLink" href="@strPassUrl">注册</a>|<a href="@ViewBag.CasForgetPwd" class="end">忘记密码?</a></p>
                                <p class="btn"><button id="btnLogin" type="button" class="f16">登&nbsp;录</button></p>
                            </div>
                        </form>

 

2、http://ucapi.t.nxin.com/login/getLoginTicket,从技术中心,获取信息loginTicket等标示信息,对密码进行加密,然后重新submit到https://cas.t.nxin.com/cas/v1/tickets/login

$.ajax({
                    url: "@ConfigHelper.GetConfigString("UCLoginPath")", async: false, type: "GET", dataType: "jsonp", contentType: "application/jsonp; charset=utf-8", jsonp: "cb",
                    success: function (data) {
                        if (data.code == 0) {
                            var d = data.data;
                            var p = $("#password"); //取得密码
                            $("input[name='loginTicket']").val(d.id);//填充loginTicket
                            $("#password2").val(enc(d.m, d.e, p.val())); //对密码进行加密
                            
                        }
                        else {
                            $("input[name='loginTicket']").val("");
                            $("#password2").val($("#password").val());
                        };
                        $("#login").submit();
                    }
                });

 

posted @ 2016-11-15 18:10  wjl910  阅读(84)  评论(0)    收藏  举报