由于行业的业务功能需要,需要与菜鸟对接登录日志,将我们系统的用户登录信息提交给菜鸟,菜鸟分析通过分析日志,检查存在的一些安全问题。根据菜鸟提供的标准,实现了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#实现的更多相关文章

  1. 使用VLL技术实现多家合作伙伴复用同一条链路做两端数据全透传

    公司A当前租用一条10G跨市运营商光缆,自身业务只用到一半流量,为节省成本,寻求多家合作伙伴共用链路以达到财务需求 合作伙伴需求接入链路全透传,即光缆两端接入点端口逻辑直连 当前有三种方案可以实现上述 ...

  2. ELK日志系统之通用应用程序日志接入方案

    前边有两篇ELK的文章分别介绍了MySQL慢日志收集和Nginx访问日志收集,那么各种不同类型应用程序的日志该如何方便的进行收集呢?且看本文我们是如何高效处理这个问题的 日志规范 规范的日志存放路径和 ...

  3. HC大会,华为联合合作伙伴发布一站式物联网IoT开发工具小熊派BearPi

    传统的物联网产品开发步骤复杂,涉及硬件开发.软件开发.云端开发等众多流程.而且产品的开发周期长.开发成本高.产品稳定性不佳.维护成本高.而物联网设备本身市场竞争激烈,价格低,设备更新迭代快,所以在保证 ...

  4. 干货来了!2019阿里云合作伙伴峰会SaaS加速器专场回顾合集:嘉宾分享、深度解读

    2019年7月26日,在上海举办的阿里云合作伙伴峰会上,阿里云正式发布SaaS生态战略,计划用阿里云的品牌.渠道.资本.方法论.技术加持伙伴,成就亿级营收独角兽. 该生态战略计划招募10家一级SaaS ...

  5. 阿里云合作伙伴峰会SaaS加速器专场 | 商业加持,迈进亿元俱乐部

    导语:本文中,阿里云智能运营专家朱以军从宏观角度分析了SaaS市场的机遇和挑战,重点介绍了阿里云的商业操作系统.同时,阿里云SaaS加速器也在招募更多ISV合作伙伴和我们一起共创专注面向未来的应用,用 ...

  6. 阿里云亮相2019联通合作伙伴大会,边缘计算等3款云产品助力5G时代产业数字化转型

    4月23日,2019中国联通合作伙伴大会在上海正式开幕,本次大会以“合作不设限,共筑新生态”为主题,涉及5G.边缘计算.云计算.物联网.新媒体.人工智能.互联网化等各领域超过600家合作伙伴与3万名各 ...

  7. 华清远见成为ARM大学计划正式合作伙伴

    来源:华清远见嵌入式学院 近日,华清远见教育集团成为ARM大学计划合作伙伴,这是ARM大学计划合作伙伴中的国内唯一教育机构.此次合作是ARM公司对华清远见教育集团的高度认可,也充分证明了华清远见这些年 ...

  8. 让我们共同构筑物联网起飞的平台:物联网操作系统Hello China寻求应用合作伙伴

    经过几天的努力,终于把Hello China V1.76版的内核移植到基于Cortex-M3内核的STM32 chipset上.因为还希望进一步写一个USART驱动程序,因此详细的移植文档,预计一周之 ...

  9. IBM新合作伙伴计划助力企业转型升级

        IBM作为老牌企业,一直在引领者技术方面的变革.当IBM再一次从自我革新开始,期望能够更快的将认知计算和云推广给自己的合作伙伴和用户们,以帮助他们在新的转型期内,能够快人一步.         ...

随机推荐

  1. git 创建管理多用户

    <搬运> Windows下Git多账号配置,同一电脑多个ssh-key的管理 一台电脑上的git同时使用两个github账户 git之https或http方式设置记住用户名和密码的方法

  2. LEETCODE —— Unique Paths II [Dynamic Programming]

    唯一路径问题II Unique Paths II Follow up for "Unique Paths": Now consider if some obstacles are ...

  3. Python20-Day06

    常用模块 一.random模块 import random # print(random.random()) #打印0-1之间的小数 # print(random.randint(1,3)) #大于等 ...

  4. 虚拟机搭建Hadoop集群

    安装包准备 操作系统:ubuntu-16.04.3-desktop-amd64.iso 软件包:VirtualBox 安装包:hadoop-3.0.0.tar.gz,jdk-8u161-linux-x ...

  5. 08慕课网《进击Node.js基础(一)》事件events

    引用events模块中的EventEmitter 事件的监听和发射 相同的事件发射数量有限,可以通过setMaxListeners设置峰值 var EventEmitter = require('ev ...

  6. 转载 intellij IDEA 使用体验 (本人感觉它的使用是一种趋势)

    从去年开始转java以来,一直在寻找一款趁手的兵器,eclipse虽然是很多java程序员的首选,但是我发现一旦安装了一些插件,workspace中的项目达到数10个以后,经常崩溃,实在影响编程的心情 ...

  7. 软工1816 · Beta冲刺(6/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 推进Web端完成开发 推进修改一些后端接口的逻辑 着手制作视频 接下来的计划 ...

  8. 第三次作业---excel导入数据库及显示

    好吧首先承认这次作业失败了,而且我并不知道原因.另外,我也没有采用PowerDesigner 设计所需要的数据库,代码就用了全部的时间.感觉自己就像一个刚学会爬着走路的小孩去参加一百一十米跨栏,能不能 ...

  9. 0506-Scrum 项目 2.0视频

    一.团队项目要求 应用NABCD模型,分析你们初步选定的项目,充分说明你们选题的理由. 录制为演说视频,上传到视频网站,并把链接发到团队博客上. 二.NABCD模型 选题:约拍平台——家教平台 1) ...

  10. 弹出提示框的方式——java

    1.显示一个错误对话框,该对话框显示的 message 为 'alert': JOptionPane.showMessageDialog(null, "alert", " ...