/// <summary> /// 向SSOManage站点发起校验令牌信息的请求 /// </summary> /// <param name="ssoInfo">包含令牌信息的参数</param> /// <param name="timeOutMs">超时时间,单位为毫秒,默认为5000毫秒</param> /// <returns>如果验证成功返回true,否则返回false</returns> public static bool CheckSSOLoginState(SSOInfo ssoInfo, int timeOutMs = 5000) { if (ssoInfo == null || string.IsNullOrEmpty(ssoInfo.UserId) || string.IsNullOrEmpty(ssoInfo.Token)) { return(false); } if (EnvProvider.Default.IsSSOManageSite) { LibHandle handle = LibHandleCache.Default.IsExistsHandle(LibHandeleType.PC, ssoInfo.UserId); if (handle != null) { return(handle.Token == ssoInfo.Token); } return(false); } if (string.IsNullOrEmpty(EnvProvider.Default.SSOManageSiteUrl)) { return(false); } try { string url = string.Format("{0}/sysSvc/CheckSSOLoginState", EnvProvider.Default.SSOManageSiteUrl); var postP = new { ssoInfo = ssoInfo }; string errorInfo = string.Empty; dynamic result = LibNetUtils.HttpPostCall <dynamic>(url, postP, out errorInfo, timeOutMs); if (string.IsNullOrEmpty(errorInfo) == false || result == null) { return(false); } else { // 私钥解密 string ret = LibRSAHelper.Decrypt((string)result.CheckSSOLoginStateResult);//对于直接返回基本类型的接口调用,结果会包装成方法名+Result return(ret == "0"); } } catch (Exception exp) { LibCommUtils.AddOutput("CrossSiteCall", string.Format("CheckSSOLoginState error:{0}\r\nStacktrace:{1}", exp.Message, exp.StackTrace)); return(false); } }
/// <summary> /// 检查指定账户是否已以某个loginToken形式登录(SSO管理站点才有用) /// </summary> /// <param name="ssoInfo">包含用户账号、访问令牌等</param> /// <returns></returns> public string CheckSSOLoginState(SSOInfo ssoInfo) { string ret = "101"; if (!EnvProvider.Default.IsSSOManageSite) { ret = "100"; } else { LibHandle handle = LibHandleCache.Default.IsExistsHandle(LibHandeleType.PC, ssoInfo.UserId); if (handle != null && handle.Token == ssoInfo.Token) { ret = "0"; } } // 公钥加密 ret = LibRSAHelper.Encrypt(ret); return(ret); }
/// <summary> /// 单点登录。 /// 1.检查当前本站点系统账户中是否存在userId,如果否则不予登录 /// 2.使用userId、loginToken等访问sso管理站点的CheckSSOLoginState方法检验是否已经SSO登录过。 /// 如果未登录过则不予登录。 /// 3.判断当前站点中userId是否已经登录过,如果是则使用对应的LibHandle信息返回,否则则新构造LibHande并返回。 /// </summary> ///<param name="ssoInfo">单点登录信息</param> /// <returns></returns> public LoginInfo SSOLogin(SSOInfo ssoInfo) { LoginInfo loginInfo = new LoginInfo() { IsUsed = true, IsOverUser = false }; SqlBuilder builder = new SqlBuilder("axp.User"); string sql = builder.GetQuerySql(0, "A.PERSONID,A.PERSONNAME,A.ROLEID,A.WALLPAPER,A.WALLPAPERSTRETCH", string.Format("A.USERID={0} And A.ISUSE=1", LibStringBuilder.GetQuotString(ssoInfo.UserId))); LibDataAccess dataAccess = new LibDataAccess(); string roleId = string.Empty; using (IDataReader reader = dataAccess.ExecuteDataReader(sql)) { if (reader.Read()) { loginInfo.PersonId = LibSysUtils.ToString(reader[0]); loginInfo.PersonName = LibSysUtils.ToString(reader[1]); roleId = LibSysUtils.ToString(reader[2]); loginInfo.Wallpaper = LibSysUtils.ToString(reader[3]); loginInfo.Stretch = LibSysUtils.ToBoolean(reader[4]); loginInfo.IsUsed = false; } else { return(loginInfo); } } if (CheckToken(ssoInfo)) { // 授权成功 LibHandle handle = LibHandleCache.Default.IsExistsHandle(LibHandeleType.PC, ssoInfo.UserId); if (handle == null) { handle = LibHandleCache.Default.GetHandle(string.Empty, LibHandeleType.PC, ssoInfo.UserId, loginInfo.PersonId, loginInfo.PersonName, roleId); } loginInfo.Handle = handle.Handle; return(loginInfo); } return(loginInfo); }
private bool CheckToken(SSOInfo ssoInfo) { if (EnvProvider.Default.IsSSOManageSite) { LibHandle handle = LibHandleCache.Default.IsExistsHandle(LibHandeleType.PC, ssoInfo.UserId); if (handle != null) { if (handle.Token == ssoInfo.Token) { return(true); } } } else { try { string baseUrl = EnvProvider.Default.SSOManageSiteUrl; string url = baseUrl + "/sysSvc/checkSSOLoginState"; string errorInfo = ""; dynamic obj = LibNetUtils.HttpPostCall <dynamic>(url, new { ssoInfo = ssoInfo }, out errorInfo); if (string.IsNullOrEmpty(errorInfo)) { string ret = LibRSAHelper.Decrypt(obj.CheckSSOLoginStateResult.Value); if (ret == "0") { return(true); } } } catch (Exception) { //throw; } } return(false); }