From 738a601386ae27c4613a6006383206bd2a039d63 Mon Sep 17 00:00:00 2001 From: Frane Date: Fri, 17 Sep 2021 15:22:38 +0800 Subject: [PATCH] =?UTF-8?q?20210917=20=E4=B8=8E=E4=BA=94=E7=8E=AFOA?= =?UTF-8?q?=E5=8D=95=E7=82=B9=E7=99=BB=E9=99=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SGGL/BLL/Common/Const.cs | 5 + SGGL/BLL/Common/Funs.cs | 10 ++ SGGL/BLL/LoginService.cs | 26 +++++ SGGL/FineUIPro.Web/ErrLog.txt | 34 +++++- SGGL/FineUIPro.Web/Login.aspx.cs | 97 ++++++++++++++---- 开发需求/OA对接密钥.txt | 7 ++ 开发需求/智慧工地与五环OA集成说明文档(1).docx | Bin 0 -> 14872 bytes 7 files changed, 159 insertions(+), 20 deletions(-) create mode 100644 开发需求/OA对接密钥.txt create mode 100644 开发需求/智慧工地与五环OA集成说明文档(1).docx diff --git a/SGGL/BLL/Common/Const.cs b/SGGL/BLL/Common/Const.cs index cbed3410..ec046d44 100644 --- a/SGGL/BLL/Common/Const.cs +++ b/SGGL/BLL/Common/Const.cs @@ -62,6 +62,11 @@ namespace BLL /// 微信订阅模板ID /// public const string WX_TemplateID = "hKFrcahyXEjGSrLM4qBPpjXAkFldnrqxU_mARd1IF4o"; + + /// + /// 五环OA 私钥 + /// + public const string OAPrivateKey_CWCEC = "nq6pYDFkcrpzVtMrLbf2dvDPs2FDo5yeDub6YCnl0hXov3MVEVMbVe3NCnC5Thl3dwm14yI9/vNIGdH5M4getAkMnkG8tNA60NPjtHUzyoZSpVYCUOmB30s5vx+4IBkPh8R4ynkJYyUxkl61/0h6y7A86qz4jNivxAKt2a0vQxk=AQABy/DiC9r3AfTlJzuwk2BBT3X2YpVN0LE/lUIHJs64GW2siQow/k9BRcPOkBwLuVOp/YrwYPCh/XGLxjukqxCjNw==xzA32jeRGMthXVbkmn0YvFKV6O9IS7Toee2cRN8x1qRPwwnN5yOq7lunMcZyWLfCimsKmYwRe9Uw5fHMPScULw==DIzRTEt4Qd2RMH3i2t7khgBLXjuz4zDVKdk7WW8FM0Nlh7Vh2HSGHsXy8zlWm1wDrP+c1UpZnaAcKuHGu2Q1tw==jFW3dAHkM0DPFzDqHMH4FG5m+dbj65rIk2bJy2got93J6FLXA3sIqahfMl1rIIBPCrCBpk6d3s4EBm2GBKustw==ux8JAVqXtCjtaNgahpa0AK73tp+kGEkHyvt/hzp8C8LmXicNGNZtgDDHHLwxN+Lzp3z6ThfzY44oQtymljRu1g==Ye2Oj9PLltYkKhgmFI/sZZjVxXEoKgeUr8OyDrisoUtuGQCvpsJwI0affGr2oREsXeU7P9I5CmcfPvgLX9cIgsAtOcDMM81Hs6WhfbkryjyFj1CfKTI9gYZnApPInYYMew8wvUX23K6Hq+rIyHxMnSAhLvoqXor4KVQj6QRtdOU="; #endregion #region 按钮描述 diff --git a/SGGL/BLL/Common/Funs.cs b/SGGL/BLL/Common/Funs.cs index b649b3e9..654dca1a 100644 --- a/SGGL/BLL/Common/Funs.cs +++ b/SGGL/BLL/Common/Funs.cs @@ -1131,6 +1131,16 @@ namespace BLL } return value; } + + /// + /// ʱת + /// + /// + /// + public static DateTime IntToDateTime(int timestamp) + { + return TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)).AddSeconds(timestamp); + } } } diff --git a/SGGL/BLL/LoginService.cs b/SGGL/BLL/LoginService.cs index e29c1b5b..5ba04f38 100644 --- a/SGGL/BLL/LoginService.cs +++ b/SGGL/BLL/LoginService.cs @@ -38,6 +38,32 @@ namespace BLL } } + /// + /// OA ˺ŵ½ + /// + /// + /// + /// + /// + /// + public static bool UserLogOn_OA(string account, bool rememberMe, System.Web.UI.Page page) + { + List x = (from y in Funs.DB.Sys_User + where y.Account == account && y.IsPost == true + select y).ToList(); + if (x.Any()) + { + string accValue = HttpUtility.UrlEncode(account); + FormsAuthentication.SetAuthCookie(accValue, false); + page.Session[SessionName.CurrUser] = x.First(); + return true; + } + else + { + return false; + } + } + /// /// û¼ɹ /// diff --git a/SGGL/FineUIPro.Web/ErrLog.txt b/SGGL/FineUIPro.Web/ErrLog.txt index 5f282702..8591e8d9 100644 --- a/SGGL/FineUIPro.Web/ErrLog.txt +++ b/SGGL/FineUIPro.Web/ErrLog.txt @@ -1 +1,33 @@ - \ No newline at end of file + +错误信息开始=====> +错误类型:FormatException +错误信息:输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。 +错误堆栈: + 在 System.Convert.FromBase64_Decode(Char* startInputPtr, Int32 inputLength, Byte* startDestPtr, Int32 destLength) + 在 System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength) + 在 System.Convert.FromBase64String(String s) + 在 System.Security.Cryptography.RSA.FromXmlString(String xmlString) + 在 FineUIPro.Web.Login.RSADecrypt(String privatekey, String content) 位置 D:\CWCEC\SGGL_CWCEC\SGGL\FineUIPro.Web\Login.aspx.cs:行号 161 + 在 FineUIPro.Web.Login.Page_Load(Object sender, EventArgs e) 位置 D:\CWCEC\SGGL_CWCEC\SGGL\FineUIPro.Web\Login.aspx.cs:行号 74 + 在 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) + 在 System.EventHandler.Invoke(Object sender, EventArgs e) + 在 System.Web.UI.Control.OnLoad(EventArgs e) + 在 System.Web.UI.Control.LoadRecursive() + 在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +出错时间:09/17/2021 14:54:20 +出错文件:http://localhost:8118/Login.aspx?data=****&database=userName=sysgly×pan=1256015312 +IP地址:::1 + +出错时间:09/17/2021 14:54:20 + + +错误信息开始=====> +错误类型:FormatException +错误信息:该字符串未被识别为有效的 DateTime。 +错误堆栈: + 在 System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles) + 在 System.DateTime.Parse(String s) + 在 BLL.Funs.GetNewDateTime(String time) 位置 D:\CWCEC\SGGL_CWCEC\SGGL\BLL\Common\Funs.cs:行号 554 +出错时间:09/17/2021 14:56:12 +出错时间:09/17/2021 14:56:12 + diff --git a/SGGL/FineUIPro.Web/Login.aspx.cs b/SGGL/FineUIPro.Web/Login.aspx.cs index c5dfef7b..b9d06940 100644 --- a/SGGL/FineUIPro.Web/Login.aspx.cs +++ b/SGGL/FineUIPro.Web/Login.aspx.cs @@ -4,6 +4,8 @@ using System; using System.Configuration; using System.Linq; + using System.Security.Cryptography; + using System.Text; using System.Web; using System.Web.Services; @@ -65,6 +67,32 @@ { if (!IsPostBack) { + string userdata = Request.Params["basedata"]; + if (!string.IsNullOrEmpty(userdata)) + { + string result = RSADecrypt(Const.OAPrivateKey_CWCEC, userdata); //经过RSA解密后获得的域登录名+时间戳 + if (!string.IsNullOrEmpty(result)) + { + var value = Funs.GetStrListByStr(result, '|'); + if (value.Count > 1) + { + var userValues = Funs.GetStrListByStr(value[0], '='); + var timespan = Funs.GetStrListByStr(value[1], '='); + if (userValues.Count > 1 && timespan.Count > 1) + { + DateTime? dateTimeS = Funs.IntToDateTime(Funs.GetNewIntOrZero(timespan[1])); + if (dateTimeS.HasValue && DateTime.Now.AddSeconds(-30) < dateTimeS) + { + if (LoginService.UserLogOn_OA(userValues[1], true, this.Page)) + { + string url = getUrl(); + Response.Redirect(url); + } + } + } + } + } + } } } #endregion @@ -80,28 +108,59 @@ string url = ""; if (LoginService.UserLogOn(user, pwd, true, this.Page)) { - this.CurrUser.RoleType = RoleService.GetRoleTypeByRoleId(this.CurrUser.RoleId); - if (!this.CurrUser.LastIsOffice.HasValue) - { - this.CurrUser.LastIsOffice = this.CurrUser.IsOffice; - } - if (this.CurrUser.LastIsOffice == true) - { - this.CurrUser.LoginProjectId = null; - ////本部菜单 - url = "index.aspx"; - } - else - { - this.CurrUser.LoginProjectId = this.CurrUser.LastProjectId; - //// 项目菜单 - url = "indexProject.aspx?projectId=" + this.CurrUser.LastProjectId; - } - - LogService.AddSys_Log(this.CurrUser, this.CurrUser.UserName, this.CurrUser.UserId, Const.UserMenuId, Const.BtnLogin); + url = getUrl(); } return url; } + + /// + /// 获取跳转页面 + /// + /// + private string getUrl() + { + string url = ""; + this.CurrUser.RoleType = RoleService.GetRoleTypeByRoleId(this.CurrUser.RoleId); + if (!this.CurrUser.LastIsOffice.HasValue) + { + this.CurrUser.LastIsOffice = this.CurrUser.IsOffice; + } + if (this.CurrUser.LastIsOffice == true) + { + this.CurrUser.LoginProjectId = null; + ////本部菜单 + url = "index.aspx"; + } + else + { + this.CurrUser.LoginProjectId = this.CurrUser.LastProjectId; + //// 项目菜单 + url = "indexProject.aspx?projectId=" + this.CurrUser.LastProjectId; + } + + LogService.AddSys_Log(this.CurrUser, this.CurrUser.UserName, this.CurrUser.UserId, Const.UserMenuId, Const.BtnLogin); + + return url; + } + + + /// + /// + /// 用私钥对数据进行RSA解密 + /// + /// + /// + /// + public static string RSADecrypt(string privatekey, string content) + { + + RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); + byte[] cipherbytes; + rsa.FromXmlString(privatekey); + //对参数content进行两次base64解密 + cipherbytes = rsa.Decrypt(Convert.FromBase64String(Encoding.UTF8.GetString(Convert.FromBase64String(content))), false); + return Encoding.UTF8.GetString(cipherbytes); + } } } diff --git a/开发需求/OA对接密钥.txt b/开发需求/OA对接密钥.txt new file mode 100644 index 00000000..02c0d16f --- /dev/null +++ b/开发需求/OA对接密钥.txt @@ -0,0 +1,7 @@ +publickey + +rnq6pYDFkcrpzVtMrLbf2dvDPs2FDo5yeDub6YCnl0hXov3MVEVMbVe3NCnC5Thl3dwm14yI9/vNIGdH5M4getAkMnkG8tNA60NPjtHUzyoZSpVYCUOmB30s5vx+4IBkPh8R4ynkJYyUxkl61/0h6y7A86qz4jNivxAKt2a0vQxk=AQAB + + +privatekey:nq6pYDFkcrpzVtMrLbf2dvDPs2FDo5yeDub6YCnl0hXov3MVEVMbVe3NCnC5Thl3dwm14yI9/vNIGdH5M4getAkMnkG8tNA60NPjtHUzyoZSpVYCUOmB30s5vx+4IBkPh8R4ynkJYyUxkl61/0h6y7A86qz4jNivxAKt2a0vQxk=AQAB +y/DiC9r3AfTlJzuwk2BBT3X2YpVN0LE/lUIHJs64GW2siQow/k9BRcPOkBwLuVOp/YrwYPCh/XGLxjukqxCjNw==xzA32jeRGMthXVbkmn0YvFKV6O9IS7Toee2cRN8x1qRPwwnN5yOq7lunMcZyWLfCimsKmYwRe9Uw5fHMPScULw==DIzRTEt4Qd2RMH3i2t7khgBLXjuz4zDVKdk7WW8FM0Nlh7Vh2HSGHsXy8zlWm1wDrP+c1UpZnaAcKuHGu2Q1tw==jFW3dAHkM0DPFzDqHMH4FG5m+dbj65rIk2bJy2got93J6FLXA3sIqahfMl1rIIBPCrCBpk6d3s4EBm2GBKustw==ux8JAVqXtCjtaNgahpa0AK73tp+kGEkHyvt/hzp8C8LmXicNGNZtgDDHHLwxN+Lzp3z6ThfzY44oQtymljRu1g==Ye2Oj9PLltYkKhgmFI/sZZjVxXEoKgeUr8OyDrisoUtuGQCvpsJwI0affGr2oREsXeU7P9I5CmcfPvgLX9cIgsAtOcDMM81Hs6WhfbkryjyFj1CfKTI9gYZnApPInYYMew8wvUX23K6Hq+rIyHxMnSAhLvoqXor4KVQj6QRtdOU= \ No newline at end of file diff --git a/开发需求/智慧工地与五环OA集成说明文档(1).docx b/开发需求/智慧工地与五环OA集成说明文档(1).docx new file mode 100644 index 0000000000000000000000000000000000000000..e71dbdbf663b672b42b2c429dc3165df3e714e6b GIT binary patch literal 14872 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 V;!V5&0Jygg$eVW@Ue*k9en+^Z~ literal 0 HcmV?d00001