菜鸟合作伙伴日志接入规范之C#实现
由于行业的业务功能需要,需要与菜鸟对接登录日志,将我们系统的用户登录信息提交给菜鸟,菜鸟分析通过分析日志,检查存在的一些安全问题。根据菜鸟提供的标准,实现了C#的接入,下面分享给大家,让需要的朋友少走些弯路。
/// <summary>
/// 向菜鸟提交登录日志
/// </summary>
/// <param name="loginLogEntity">登录日志实体</param>
private static void SendLoginLog(BaseLoginLogEntity loginLogEntity)
{
/*
appId 御城河应用标识 和御城河appKey值一样
appKey 御城河appKey
method 日志类型(标识) express_login
time 上传日志的时间 yyyy-MM-dd HH:mm:ss格式
operation_time 操作时间 yyyy-MM-dd HH:mm:ss格式
company 公司名称 公司名全称
station_id 站点id 例如:14214
station 站点名称 例如:xxx数据中心
province 站点所在省份 注:勿根据IP地址计算,要记录注册地址。例如:浙江
city 站点所在城市 注:勿根据IP地址计算,要记录注册地址。例如:杭州
user_id 操作员账号ID
user 操作员账号名
source_type 发起请求的终端应用类型 web、client、ios、android、database
source_application 发起请求的应用 如果是从数据库直接登陆数据库(source_type=Database),则记数据库名。如果是登陆系统,记录发起登录请求的应用(source_type=web、client、ios或android),若有跳转或通过单点登录方式登录,记录跳转前的应用名称;否则source_application应和target_application一致。
source_public_ip(*) 登陆操作源公网IP 如果请求通过公网,记录来源的公网IP,如:xxx.xxx.xxx.xxx
source_private_ip(*) 登陆操作源内网IP 如果使用了NAT转换,记录内网IP,如:192.168.xxx.xxx
source_vpn_ip(*) 登陆操作源VPN IP 如果使用了vpn,使用vpn分配的IP,如:192.168.xxx.xxx
source_mac 源MAC地址 如果是CS架构则记录,BS架构无需记录
target_application 登录的目标应用 如果从数据库直接登陆数据库(source_type=Database),则记数据库名。如果登录系统(source_type=web、client、ios或android),则记录登录的目标系统名称,若有跳转或通过单点登录方式登录,记录跳转后的系统名称;否则target_application应和source_application一致。
target_public_ip(*) 登陆目标端公网IP 如果通过公网访问目标,记录目标的公网IP。如:xxx.xxx.xxx.xxx
target_private_ip(*) 登陆目标端内网IP 如果目标进行了NAT转换或使用了负载均衡,记录目标的内网IP,如:192.168.xxx.xxx
operation_type 操作类型 login/logout(两种类型必须记录)
result 操作结果 success/fail(两种类型必须记录)
reason 结果原因 当登录失败,或者退出时记录原因。例如timeout,password error等
feature 预留拓展字段 用键值对记录拓展字段,英文分号隔开 1. 获取御城河appKey 和appSecret
2. 按日志规范准备传入的字段参数(以UTF-8格式编码)
3. 计算signValue;
1) 针对上面准备的参数按照key进行排序(升序)然后拼接字符串
appSecretappId******appKey******company******computer_nameit-230000.xx.com……method******time******appSecret
注:将上面字符串中的红色字体替换成对应的值;最前面和最后面的appSecret处填写自己的appSecret。
2) 获取拼接字符串的UTF-8编码字节序列,采用md5方式加密,再把加密后的字节转化为16进制,得到sign字符串。
4. 对要传输的内容进行编码:
对参入的每个参数值做URL编码,这里的参数不要求顺序,但是必须对参数值进行url编码;尾部加上&sign=signValue。
appId=urlencode(appKeyValue)&…&time=urlencode(timeValue)&sign=signValue;
5. 推送数据
1) 使用post方法请求服务
http://gw.ose.aliyun.com/event/ecoLog?加上4步骤产生的字符串;
POST请求的ContentType设置为:application/x-www-form-urlencoded。
2) API返回值
所有API返回json字符串,表示调用成功与否,格式如下:{"result":"success","errMsg":""}
*/
string appId = "12111";
string appSecret = "abcter";
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("appId", appId);
dict.Add("appKey", appId);
dict.Add("method", "express_login");
DateTime createOn = loginLogEntity.CreateOn ?? DateTime.Now;
dict.Add("time", createOn.ToString(BaseSystemInfo.DateTimeFormat));
dict.Add("operation_time", createOn.ToString(BaseSystemInfo.DateTimeFormat));
dict.Add("company", "XXX公司");
dict.Add("station_id", loginLogEntity.CompanyId);
dict.Add("station", loginLogEntity.CompanyName);
dict.Add("province", loginLogEntity.Province);
dict.Add("city", loginLogEntity.City);
dict.Add("user_id", loginLogEntity.UserId);
dict.Add("user", loginLogEntity.UserName);
dict.Add("source_type", loginLogEntity.SourceType);
dict.Add("source_application", loginLogEntity.SourceApplication);
dict.Add("target_application", loginLogEntity.TargetApplication);
dict.Add("source_public_ip", loginLogEntity.IPAddress);
dict.Add("source_mac", loginLogEntity.MACAddress);
dict.Add("operation_type", loginLogEntity.OperationType == 1 ? "login" : "logout");
dict.Add("result", loginLogEntity.Result == 1 ? "success" : "fail");
dict.Add("reason", loginLogEntity.LoginStatus);
dict.Add("feature", string.Empty); var dicSort = from objDic in dict orderby objDic.Key ascending select objDic;
StringBuilder sb = new StringBuilder();
sb.Append(appSecret);
List<string> list = new List<string>();
foreach (KeyValuePair<string, object> kvp in dicSort)
{
sb.Append(kvp.Key + kvp.Value);
list.Add(kvp.Key + "=" + System.Web.HttpUtility.UrlEncode(kvp.Value.ToString(), Encoding.UTF8));
}
string parameters = string.Join("&", list);
sb.Append(appSecret);
string signValue = sb.ToString();
MD5 md5 = MD5.Create();
byte[] hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(signValue));
string result = string.Empty;
for (int i = 0; i < hashBytes.Length; i++)
{
//X 表是10进制,X2表示16进制
result += hashBytes[i].ToString("x2");
}
signValue = result; // 线程提交
ThreadPool.QueueUserWorkItem(delegate
{
try
{
string url = "http://gw.ose.aliyun.com/event/ecoLog?" + parameters + "&sign=" + signValue;
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.GetResponse();
var response = (HttpWebResponse)request.GetResponse();
using (var stream = response.GetResponseStream())
{
if (stream != null)
{
var responseString = new StreamReader(stream).ReadToEnd();
if (!string.IsNullOrWhiteSpace(responseString))
{
NLogHelper.Trace("向菜鸟推送登录日志,登录人:" + loginLogEntity.UserName + ",推送结果:" + responseString);
}
}
}
}
catch (Exception ex)
{
NLogHelper.Warn(ex, "向菜鸟推送登录日志出现异常:"+ex.Message);
}
});
}
菜鸟合作伙伴日志接入规范之C#实现的更多相关文章
- 使用VLL技术实现多家合作伙伴复用同一条链路做两端数据全透传
公司A当前租用一条10G跨市运营商光缆,自身业务只用到一半流量,为节省成本,寻求多家合作伙伴共用链路以达到财务需求 合作伙伴需求接入链路全透传,即光缆两端接入点端口逻辑直连 当前有三种方案可以实现上述 ...
- ELK日志系统之通用应用程序日志接入方案
前边有两篇ELK的文章分别介绍了MySQL慢日志收集和Nginx访问日志收集,那么各种不同类型应用程序的日志该如何方便的进行收集呢?且看本文我们是如何高效处理这个问题的 日志规范 规范的日志存放路径和 ...
- HC大会,华为联合合作伙伴发布一站式物联网IoT开发工具小熊派BearPi
传统的物联网产品开发步骤复杂,涉及硬件开发.软件开发.云端开发等众多流程.而且产品的开发周期长.开发成本高.产品稳定性不佳.维护成本高.而物联网设备本身市场竞争激烈,价格低,设备更新迭代快,所以在保证 ...
- 干货来了!2019阿里云合作伙伴峰会SaaS加速器专场回顾合集:嘉宾分享、深度解读
2019年7月26日,在上海举办的阿里云合作伙伴峰会上,阿里云正式发布SaaS生态战略,计划用阿里云的品牌.渠道.资本.方法论.技术加持伙伴,成就亿级营收独角兽. 该生态战略计划招募10家一级SaaS ...
- 阿里云合作伙伴峰会SaaS加速器专场 | 商业加持,迈进亿元俱乐部
导语:本文中,阿里云智能运营专家朱以军从宏观角度分析了SaaS市场的机遇和挑战,重点介绍了阿里云的商业操作系统.同时,阿里云SaaS加速器也在招募更多ISV合作伙伴和我们一起共创专注面向未来的应用,用 ...
- 阿里云亮相2019联通合作伙伴大会,边缘计算等3款云产品助力5G时代产业数字化转型
4月23日,2019中国联通合作伙伴大会在上海正式开幕,本次大会以“合作不设限,共筑新生态”为主题,涉及5G.边缘计算.云计算.物联网.新媒体.人工智能.互联网化等各领域超过600家合作伙伴与3万名各 ...
- 华清远见成为ARM大学计划正式合作伙伴
来源:华清远见嵌入式学院 近日,华清远见教育集团成为ARM大学计划合作伙伴,这是ARM大学计划合作伙伴中的国内唯一教育机构.此次合作是ARM公司对华清远见教育集团的高度认可,也充分证明了华清远见这些年 ...
- 让我们共同构筑物联网起飞的平台:物联网操作系统Hello China寻求应用合作伙伴
经过几天的努力,终于把Hello China V1.76版的内核移植到基于Cortex-M3内核的STM32 chipset上.因为还希望进一步写一个USART驱动程序,因此详细的移植文档,预计一周之 ...
- IBM新合作伙伴计划助力企业转型升级
IBM作为老牌企业,一直在引领者技术方面的变革.当IBM再一次从自我革新开始,期望能够更快的将认知计算和云推广给自己的合作伙伴和用户们,以帮助他们在新的转型期内,能够快人一步. ...
随机推荐
- React Native移动开发实战-5-Android平台的调试技巧
Android平台的调试和其他平台的调试也很类似,例如:在Android Studio打开的工程中,打开源码MainActivity.java,然后,将鼠标移至代码编辑区的左侧后,单击鼠标即可添加断点 ...
- 工具 | Sublime
Sublime 前言 妈耶..\(Sublime\)的界面真的是太好看啦哭哭.. 我永远喜欢Sublime! 强推Sublime... 正文 自从暑假用上的Ubontu 一开始用的是\(gedit\) ...
- [转载]java面试中经常会被问到的一些算法的问题
Java面试中经常会被问到的一些算法的问题,而大部分算法的理论及思想,我们曾经都能倒背如流,并且也能用开发语言来实现过, 可是很多由于可能在项目开发中应用的比较少,久而久之就很容易被忘记了,在此我分享 ...
- Metasploit漏洞利用,三个入侵主机实战案例
受害者主机 windows2003 ie模拟工具ietest ie5.5/6/7/ 漏洞:MS10_002,MS10_018,MS12-020 ---------------------------- ...
- Python基础系列讲解—动态类型语言的特点
前言 在C语言中变量所分配到的地址是内存空间中一个固定的位置,当我们改变变量值时, 对应内存空间中的值也相应改变.在Python中变量存储的机制是完全不一样的,当给一个变量赋值时首先解释器会给这个值分 ...
- C++ 类 析构函数
一.析构函数的定义 析构函数为成员函数的一种,名字与类名相同,在前面加‘~’没有参数和返回值在C++中“~”是位取反运算符.一个类最多只能有一个析构函数.析构函数不返回任何值,没有函数类型,也没有函数 ...
- MathExam作业
作业 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 50 40 • Estimate • ...
- Beta Scrum Day 6 — 听说
听说
- mybatis连接数据库的几种方式
1.可以通过配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="ht ...
- 用jar包运行带GUI的java游戏
这是从某论坛下载的java游戏demo,由于年代久远,所以没有记下出处.重要的是,这是一个带GUI的java程序. 链接: https://pan.baidu.com/s/1LjQ2bQPXvW-ti ...