单点登录

流程:
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">登 录</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(); } });

浙公网安备 33010602011771号