using Learun.Application.AppMagager; using Learun.Util; using Nancy; using System.Collections.Generic; using System.Linq; using Learun.Application.Base.SystemModule; using Learun.Application.TwoDevelopment.LR_Desktop; using System.Text; using System.Data; using Learun.Application.OA; using System.Configuration; using Learun.Application.TwoDevelopment.Permission; using System; using Learun.Cache.Factory; using Learun.Cache.Base; using Learun.Util.Operat; namespace Learun.Application.WebApi.Modules { public class SSOApi : BaseApi { private Perm_FunctionIBLL perm_FunctionIBLL = new Perm_FunctionBLL(); private Perm_FunctionTypeIBLL perm_FunctionTypeIBLL = new Perm_FunctionTypeBLL(); Perm_UserPermissionIBLL permUserPermissionIbll = new Perm_UserPermissionBLL(); private Perm_FunctionVisitIBLL functionVisitIbll = new Perm_FunctionVisitBLL(); private ICache cache = CacheFactory.CaChe(); public SSOApi() : base("/quanjiang/sso") { Get["/list"] = GetList; Get["/list20"] = GetList20; Get["/goto"] = GoTo; Get["/goto20"] = GoToApplication; Get["first"] = First; Post["first"] = FirstPost; Get["authorize"] = Authorize; Get["/out"] = outApplication; Get["/userstat"] = userstat; } #region 统一身份认证3.0 /// /// 退出 /// /// /// public Response outApplication(dynamic _) { string appid = Request.Query["appid"]; string appkey = Request.Query["appkey"]; string m = Request.Query["m"]; string t = Request.Query["t"]; if (string.IsNullOrEmpty(appid)) { return Fail("参数:appid不能为空"); } if (string.IsNullOrEmpty(appkey)) { return Fail("参数:appkey不能为空"); } if (string.IsNullOrEmpty(m)) { return Fail("参数:m不能为空"); } if (string.IsNullOrEmpty(t)) { return Fail("参数:t不能为空"); } var application = perm_FunctionIBLL.GetPerm_FunctionEntity(appid); if (application != null) { if (Md5Helper.Encrypt(application.FSecret, 32) == appkey) { OperatorHelper.Instance.EmptyCurrent(DESEncrypt.Decrypt(t), DESEncrypt.Decrypt(m)); return SuccessString("true"); } else { return Fail("appkey错误"); } } else return Fail("未授权的appid"); } /// /// 获取用户登录状态 /// /// /// public Response userstat(dynamic _) { string appid = Request.Query["appid"]; string appkey = Request.Query["appkey"]; string m = Request.Query["m"]; string t = Request.Query["t"]; if (string.IsNullOrEmpty(appid)) { return Fail("参数:appid不能为空"); } if (string.IsNullOrEmpty(appkey)) { return Fail("参数:appkey不能为空"); } if (string.IsNullOrEmpty(m)) { return Fail("参数:m不能为空"); } if (string.IsNullOrEmpty(t)) { return Fail("参数:t不能为空"); } var application = perm_FunctionIBLL.GetPerm_FunctionEntity(appid); if (application != null) { if (Md5Helper.Encrypt(application.FSecret, 32) == appkey) { OperatorResult res = OperatorHelper.Instance.IsOnLine(DESEncrypt.Decrypt(t), DESEncrypt.Decrypt(m)); if (res.stateCode == 1) { return SuccessString("true"); } else { return Fail("登录无效"); } } else { return Fail("appkey错误"); } } else return Fail("未授权的appid"); } #endregion /// /// 统一身份认证2.0 /// /// /// public Response Authorize(dynamic _) { string appid = Request.Query["appid"]; string secret = Request.Query["secret"]; string appkey = Request.Query["appkey"]; if (string.IsNullOrEmpty(appid)) { return Fail("参数:appid不能为空"); } if (string.IsNullOrEmpty(secret)) { return Fail("参数:secret不能为空"); } if (string.IsNullOrEmpty(appkey)) { return Fail("参数:appkey不能为空"); } var application = perm_FunctionIBLL.GetPerm_FunctionEntity(appid); if (application != null) { if (Util.DESEncrypt.Decrypt(application.FSecret, ConfigurationManager.AppSettings["SSOPublicSecret"]).Equals(secret)) { try { var code = DESEncrypt.Decrypt(appkey, "bjqjsso"); if (!string.IsNullOrEmpty(cache.Read(code))) { return Success(new { useraccount = cache.Read(code) }); } else { return Fail("appkey已过期"); } } catch (Exception e) { return Fail("appkey错误"); } } else { return Fail("secret错误"); } } else return Fail("未授权的appid"); } private Response FirstPost(dynamic _) { string publickey = ConfigurationManager.AppSettings["SSOPublicSecret"]; var ssoparam = this.GetReqData(); if (!string.IsNullOrEmpty(ssoparam.UPId)) { Perm_FunctionEntity up = new Perm_FunctionEntity(); up.UPUserName = ssoparam.UPUserName; up.UPPass = ssoparam.UPPass; up.FId = ssoparam.FId; up.UserId = ssoparam.UserId; perm_FunctionIBLL.SaveEntityByUPId(ssoparam.UPId, up); return Success(new { FInterfaceUrl = "/SSO/GoTo?sysid=" + DESEncrypt.Encrypt(up.FId, publickey) + "&openid=" + DESEncrypt.Encrypt(up.UserId, publickey) }); } else { return Fail("参数错误"); } } private Response First(dynamic _) { string publickey = ConfigurationManager.AppSettings["SSOPublicSecret"]; var ssoparam = this.GetReqData(); string sysid = ssoparam.sysid; string strsysid = DESEncrypt.Decrypt(sysid, publickey); string openid = ssoparam.openid; string userid = DESEncrypt.Decrypt(openid, publickey); var uplist = permUserPermissionIbll.GetPerm_UserPermissionEntityByFIdAndUid(strsysid, userid); if (uplist == null) { return Fail("用户未授权。"); } var perfun = perm_FunctionIBLL.GetPerm_FunctionEntityByUPId(uplist.UPId); return Success(perfun); } public class SSOParam { public string sysid { get; set; } public string openid { get; set; } public string UPId { get; set; } public string FId { get; set; } public string UserId { get; set; } public string UPUserName { get; set; } public string UPPass { get; set; } public string appid { get; set; } } public Response GoToApplication(dynamic _) { var userinfo = userInfo; var ssoparam = this.GetReqData(); if (userinfo != null) { var type = 0;//1学生 0教师 if (userinfo.Description == "学生") { type = 1; } var perm_application = perm_FunctionIBLL.GetPerm_FunctionEntity(ssoparam.appid); if (perm_application != null) { //写入当前请求所登录的用户 var code = Util.CommonHelper.RndNum(9); cache.Write(code, userinfo.account, TimeSpan.FromMinutes(10)); var url = perm_application.FUrl; if (url.Contains("?")) { url += "&appkey=" + Md5Helper.Encrypt(Util.DESEncrypt.Decrypt(perm_application.FSecret, ConfigurationManager.AppSettings["SSOPublicSecret"]), 32) + "&name=" + DESEncrypt.Encrypt(userinfo.realName, Util.DESEncrypt.Decrypt(perm_application.FSecret, ConfigurationManager.AppSettings["SSOPublicSecret"]), false) + "&no=" + DESEncrypt.Encrypt(userinfo.IdentityCardNo, Util.DESEncrypt.Decrypt(perm_application.FSecret, ConfigurationManager.AppSettings["SSOPublicSecret"]), false) + "&acc=" + DESEncrypt.Encrypt(userinfo.enCode, Util.DESEncrypt.Decrypt(perm_application.FSecret, ConfigurationManager.AppSettings["SSOPublicSecret"]), false) + "&type=" + type + "&m=" + DESEncrypt.Encrypt(userinfo.loginMark) + "&t=" + DESEncrypt.Encrypt(userinfo.token); } else { url += "?appkey=" + Md5Helper.Encrypt(Util.DESEncrypt.Decrypt(perm_application.FSecret, ConfigurationManager.AppSettings["SSOPublicSecret"]), 32) + "&name=" + DESEncrypt.Encrypt(userinfo.realName, Util.DESEncrypt.Decrypt(perm_application.FSecret, ConfigurationManager.AppSettings["SSOPublicSecret"]), false) + "&no=" + DESEncrypt.Encrypt(userinfo.IdentityCardNo, Util.DESEncrypt.Decrypt(perm_application.FSecret, ConfigurationManager.AppSettings["SSOPublicSecret"]), false) + "&acc=" + DESEncrypt.Encrypt(userinfo.enCode, Util.DESEncrypt.Decrypt(perm_application.FSecret, ConfigurationManager.AppSettings["SSOPublicSecret"]), false) + "&type=" + type + "&m=" + DESEncrypt.Encrypt(userinfo.loginMark) + "&t=" + DESEncrypt.Encrypt(userinfo.token); } return Success(new { FInterfaceUrl = url }); } else return Fail("appid解析失败,请确认。"); } else { return Fail("用户信息解析失败,请确认。"); } } public Response GoTo(dynamic _) { try { var ssoparam = this.GetReqData(); string publickey = ConfigurationManager.AppSettings["SSOPublicSecret"]; string sysid = ssoparam.sysid; string strsysid = DESEncrypt.Decrypt(sysid, publickey); string openid = ssoparam.openid; string userid = DESEncrypt.Decrypt(openid, publickey); var uplist = permUserPermissionIbll.GetPerm_UserPermissionEntityByFIdAndUid(strsysid, userid); Perm_FunctionVisitEntity functionVisitEntity = new Perm_FunctionVisitEntity(); functionVisitEntity.Create(); functionVisitEntity.Fid = strsysid; functionVisitEntity.PDate = DateTime.Now; functionVisitEntity.PUId = userid; var userinfo = userInfo; functionVisitEntity.PUName = userinfo.realName; if (uplist == null) { functionVisitEntity.PIsLoginSuccess = false; functionVisitEntity.PContent = "用户未授权"; functionVisitIbll.SaveEntity(null, functionVisitEntity); return Fail("用户未授权。"); } var perfun = perm_FunctionIBLL.GetPerm_FunctionEntityByUPId(uplist.UPId); string secretkey = DESEncrypt.Decrypt(perfun.FSecret, publickey); if (perfun.FIsManagePage == true) { if (!string.IsNullOrEmpty(perfun.FInterfaceUrl)) { if (!string.IsNullOrEmpty(perfun.UPUserName) && !string.IsNullOrEmpty(perfun.UPPass)) { functionVisitEntity.PIsLoginSuccess = true; functionVisitEntity.PContent = "成功转到统一认证网站:" + perfun.FUrl; functionVisitIbll.SaveEntity(null, functionVisitEntity); var user = LoginUserInfo.Get(); return Success(new { FInterfaceUrl = perfun.FInterfaceUrl + "?u=" + DESEncrypt.Encrypt(DESEncrypt.Encrypt(perfun.UPUserName, secretkey), publickey) + "&p=" + DESEncrypt.Encrypt(DESEncrypt.Encrypt(perfun.UPPass, secretkey), publickey) + "&t=" + DESEncrypt.Encrypt( DESEncrypt.Encrypt(DateTime.Now.ToString("yyyyMMddHHmmss"), secretkey), publickey) + "&ip=" + DESEncrypt.Encrypt(DESEncrypt.Encrypt(GetIP(), secretkey), publickey) + "&m=" + DESEncrypt.Encrypt(user.loginMark) + "&t=" + DESEncrypt.Encrypt(user.token) }); } else { functionVisitEntity.PIsLoginSuccess = false; functionVisitEntity.PContent = "用户未配置转到用户名密码配置页面"; functionVisitIbll.SaveEntity(null, functionVisitEntity); //用户未配置转到用户名密码配置页面 return Success(new { FInterfaceUrl = "/SSO/FirstLogin?sysid=" + sysid + "&openid=" + openid }); } } else { functionVisitEntity.PIsLoginSuccess = false; functionVisitEntity.PContent = "未配置登录接口地址"; functionVisitIbll.SaveEntity(null, functionVisitEntity); return Fail("未配置登录接口地址。"); } } else { if (!string.IsNullOrEmpty(perfun.FUrl)) { functionVisitEntity.PIsLoginSuccess = true; functionVisitEntity.PContent = "成功转到统一认证网站:" + perfun.FUrl; functionVisitIbll.SaveEntity(null, functionVisitEntity); return Success(new { FInterfaceUrl = perfun.FUrl }); } else { functionVisitEntity.PIsLoginSuccess = false; functionVisitEntity.PContent = "未配置地址"; functionVisitIbll.SaveEntity(null, functionVisitEntity); return Fail("未配置地址。"); } } } catch (Exception e) { return Fail("参数错误。"); } } public Response GetList20(dynamic _) { var userinfo = userInfo; var functionlist = perm_FunctionIBLL.GetListByUserId(userinfo.userId).Where(m => m.FIsH5 == true).Select(m => new { m.FName, m.FId, }); return Success(functionlist); } /// /// 获取页面显示列表数据 /// /// /// public Response GetList(dynamic _) { string publickey = ConfigurationManager.AppSettings["SSOPublicSecret"]; var logininfo = userInfo; var datatype = perm_FunctionTypeIBLL.GetListByUserId(userInfo.userId); foreach (var typeEntity in datatype) { var datafunction = perm_FunctionIBLL.GetListByFTId(typeEntity.FTId, userInfo.userId).Where(m => m.FIsH5 == true); foreach (var item in datafunction) { if (item.FIsManagePage == true) { item.FInterfaceUrl = "/SSO/GoTo?sysid=" + DESEncrypt.Encrypt(item.FId, publickey) + "&openid=" + DESEncrypt.Encrypt(logininfo.userId, publickey); } else { item.FInterfaceUrl = item.FUrl; } item.FUrl = null; } typeEntity.PermFunction = datafunction.ToList(); } return Success(datatype); } /// /// 获取IP /// /// private string GetIP() { string ip = string.Empty; if (!string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"])) ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]); if (string.IsNullOrEmpty(ip)) ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]); return ip; } } }