pull/1/head
吴顺明 2 years ago
parent ed049673f6
commit e546cb5b33

@ -1,223 +0,0 @@

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Linq;
using UMC.Web;
using UMC.Net;
namespace UMC.Proxy.Extends
{
public class Tableau : Proxy.SiteProxy
{
string encryptedPassword(Hashtable hashtable, String passwrod)
{
var key = hashtable["key"] as Hashtable;
return UMC.Data.Utility.Hex(UMC.Data.Utility.RSA(key["n"] as string, key["e"] as string, passwrod));
}
public override bool Proxy(HttpProxy proxy)
{
if (proxy.RawUrl.StartsWith("/t/"))
{
Chart(proxy);
return true;
}
else if (proxy.RawUrl.StartsWith("/vizportal/api/web/v1/getSessionInfo"))
{
getSessionInfo(proxy);
return true;
}
return false;
}
void Login(HttpProxy proxy, Action callback)
{
var webReq = proxy.Reqesut(new Uri(proxy.Domain, "/vizportal/api/web/v1/generatePublicKey").WebRequest(proxy.Cookies));
webReq.Post(new WebMeta().Put("method", "generatePublicKey").Put("params", new WebMeta()), responseMessage =>
{
responseMessage.ReadAsString(kko =>
{
var result = UMC.Data.JSON.Deserialize(kko) as Hashtable;
var publicKey = result["result"] as Hashtable;
var Value = new WebMeta();
proxy.ShareUser();
Value.Put("username", proxy.SiteCookie.Account, "encryptedPassword", encryptedPassword(publicKey, proxy.Password), "keyId", publicKey["keyId"] as string);
var login = new WebMeta().Put("method", "login").Put("params", Value);
proxy.Reqesut(proxy.Context.Transfer(new Uri(proxy.Domain, "/vizportal/api/web/v1/login"), proxy.Cookies))
.Post(login, h =>
{
h.ReadAsData((b, i, c) =>
{
if (b.Length == 0 && c == 0)
{
if (i == -1)
{
proxy.Context.Error(h.Error);
}
else
{
callback();
}
}
});
});
proxy.IsChangeUser = true;
}, proxy.Context.Error);
});
}
void Chart(HttpProxy proxy)
{
if (proxy.RawUrl.Contains("Cache=NO"))
{
Login(proxy, () =>
{
proxy.Reqesut(proxy.Context.Transfer(new Uri(proxy.Domain, proxy.RawUrl), proxy.Cookies)).Get(re => Chart(re, proxy)); ;
});
}
else if (proxy.SiteCookie != null && (proxy.SiteCookie.LoginTime ?? 0) + 600 < UMC.Data.Utility.TimeSpan())
{
Login(proxy, () =>
{
proxy.Reqesut(proxy.Context.Transfer(new Uri(proxy.Domain, proxy.RawUrl), proxy.Cookies)).Get(re => Chart(re, proxy)); ;
});
}
else
{
proxy.Reqesut(proxy.Context.Transfer(new Uri(proxy.Domain, proxy.RawUrl), proxy.Cookies)).Get(re =>
{
if (re.StatusCode == HttpStatusCode.Found)
{
Login(proxy, () =>
{
proxy.Reqesut(proxy.Context.Transfer(new Uri(proxy.Domain, proxy.RawUrl), proxy.Cookies)).Get(res => Chart(res, proxy)); ;
});
}
else
{
Chart(re, proxy);
}
});
}
}
void Chart(NetHttpResponse re, HttpProxy proxy)
{
re.ReadAsString(Result =>
{
var webResource = proxy.WebResource;
var cdnKey = proxy.MD5(proxy.Site.Caption);
var regex = new System.Text.RegularExpressions.Regex("(?<key>\\shref|\\ssrc)=\"(?<src>[^\"]+)\"");
var bIndex = Result.IndexOf("<textarea ");
if (bIndex == -1)
{
proxy.Context.Output.Write(Result.Replace("\"/vizql/v_", String.Format("\"{0}/{1}/vizql/v_", webResource, cdnKey)));
proxy.Context.OutputFinish();
return;
}
var eIndex = Result.IndexOf("</textarea>");
var bResult = Result.Substring(0, bIndex);
var eResult = Result.Substring(eIndex);
var textarea = Result.Substring(bIndex, eIndex - bIndex);
textarea = textarea.Substring(textarea.IndexOf(">") + 1);
textarea = WebUtility.HtmlDecode(textarea).Replace("\"/vizql/v_", String.Format("\"{0}/{1}/vizql/v_", webResource, cdnKey));
bResult = regex.Replace(bResult, g =>
{
var src = g.Groups["src"].Value;
if (src.IndexOf(':') == -1)
{
var vsrc = new Uri(proxy.Context.Url, WebUtility.HtmlDecode(src)).PathAndQuery;
src = String.Format("{0}/{1}{2}", webResource, cdnKey, vsrc);
}
return String.Format("{0}=\"{1}\"", g.Groups["key"], src);
});
eResult = regex.Replace(eResult, g =>
{
var src = g.Groups["src"].Value;
if (src.IndexOf(':') == -1 && src.Length > 0)
{
var vsrc = new Uri(proxy.Context.Url, WebUtility.HtmlDecode(src)).PathAndQuery;
src = String.Format("{0}/{1}{2}", webResource, cdnKey, vsrc);
}
return String.Format("{0}=\"{1}\"", g.Groups["key"], src);
});
var sb = new StringBuilder();
sb.Append(bResult);
sb.Insert(bResult.LastIndexOf("</style>"), "#main-content{background-color: #fff}");
sb.Append("<textarea id=\"tsConfigContainer\">");
sb.Append(WebUtility.HtmlDecode(textarea));
sb.Append(eResult);
proxy.Context.ContentType = re.ContentType;
proxy.Context.Output.Write(sb.ToString());
proxy.Context.OutputFinish();
}, proxy.Context.Error);
}
void getSessionInfo(HttpProxy proxy)
{
var webReq = proxy.Reqesut(proxy.Context.Transfer(new Uri(proxy.Domain, "/vizportal/api/web/v1/getSessionInfo"), proxy.Cookies));
var cookie = proxy.Cookies.GetCookie("XSRF-TOKEN");
if (cookie != null)
{
webReq.Headers["X-XSRF-TOKEN"] = cookie.Value;
}
webReq.ContentType = "application/json";
webReq.Post("{\"method\":\"getSessionInfo\",\"params\":{}}", re =>
{
switch (re.StatusCode)
{
case HttpStatusCode.Unauthorized:
Login(proxy, () =>
{
cookie = proxy.Cookies.GetCookie("XSRF-TOKEN");
if (cookie != null)
{
webReq.Headers["X-XSRF-TOKEN"] = cookie.Value;
}
webReq.Post("{\"method\":\"getSessionInfo\",\"params\":{}}", res =>
{
proxy.Response(res);
});
});
break;
default:
proxy.Response(re);
break;
}
});
}
}
}

@ -3446,11 +3446,6 @@ namespace UMC.Proxy
}
if (this.Site.Proxy?.Proxy(this) == true)
{
Context.UseSynchronousIO(this.ProcessEnd);
return;
}
}
var getUrl = new Uri(Domain, RawUrl);

@ -272,21 +272,21 @@ namespace UMC.Proxy
this.AllowAllPath = this.AllowPath.Contains("*");
var proxy = UMC.Data.Reflection.Configuration("proxy")[this.Site.Root];
if (proxy != null)
{
this.Proxy = UMC.Data.Reflection.CreateObject(proxy) as UMC.Proxy.SiteProxy;
}
// var proxy = UMC.Data.Reflection.Configuration("proxy")[this.Site.Root];
// if (proxy != null)
// {
// this.Proxy = UMC.Data.Reflection.CreateObject(proxy) as UMC.Proxy.SiteProxy;
// }
}
public bool AllowAllPath
{
get; set;
}
public UMC.Proxy.SiteProxy Proxy
{
// public UMC.Proxy.SiteProxy Proxy
// {
get; set;
}
// get; set;
// }
/// <summary>
/// 默认ContentType类型
/// </summary>

@ -1,12 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace UMC.Proxy
{
public abstract class SiteProxy
{
public abstract bool Proxy(HttpProxy proxy);
}
}

@ -12,6 +12,8 @@ Apiumc Gateway 是高性能的Web网关它从底层Socket原始通信层开
在追求功能多样性上性能也无语伦比拥有多种措施大幅度改善源应用性能是企业和从业者非常值得掌握的的Web应用托管工具是F5国产替代首先。
### 下载安装
1. 从发行版处或官网上下载对应操作系统下的版本,解压运行即可。
@ -53,5 +55,17 @@ Apiumc内置图片切割水印原理是通过代理响应后根据参数
网关登录是相比单点登录形式来说,它无需改造第三方应用,帮助企业各应用快速实现统一登录。与应用身份对接是通过网关技术来兼容企业现有应用,让各应用身份对接在线配置即可,配置过程中原应用无感知,对企业来说协调各应用负责人更容易,整体拥有成本更低。
相对于Https证书、内网穿透、图片切割是从网关出发对具体事务创新性实现而企业的统一登录是企业身份体系和各应用的梳理是系统全局性的解决方案相比我们开拓的网关登录技术路线比传统经典单点登录更有成本优势还想更进一步了解网关登录欢迎咨询我们乐意与各位分享我们对企业统一登录的研究成果。
相对于Https证书、内网穿透、图片切割是从网关出发对具体事务创新性实现而企业的统一登录是企业身份体系和各应用的梳理和诊断并根据Apiumc提供的7种登录方式提练出Api配置身份配置转化是一个专业性实施性解决方案相对来说我们开拓的网关登录技术路线比传统经典单点登录更有优势因为网关登录方案不用改造第三方应用少了各应用适配登录协议的二次开发工具还有节省更多的是企业协调成本更还想更进一步了解网关登录欢迎咨询我们乐意与各位分享我们在各企业实施统一登录的研究成果。
### 加入我们
Apiumc是为了打造通过网关来强化应用功能公共开源产品目前我们用.net core完成了核心部分达到不错的性能但通过网关来强化应用还有很多未开发的邻地例如数据埋点日志分析来加强应用网一个通过网关来加强应用功能技术同时具有超高性能比用.net core高阶语言达到不输出低阶语言的性能同时换回比低阶语言更高编程性
Apiumc是用网关形式来加强应用这是一个新的场景目前我们用.net core完成了核心部分性能也相当不错还有很多场景需要专业人员加入我们才能丰富例如日志分析虽然Apiumc已经能很方便的能收集日志也能收集其它收集需要数据埋点才能收集的用户维度但目前来说我们只是按身份收集全日志从分析层面来讲还还远远不够如何去丰富这个带用户维度日志模型需要各位一起加入完善。

Loading…
Cancel
Save