由于行业的业务功能需要,需要与菜鸟对接登录日志,将我们系统的用户登录信息提交给菜鸟,菜鸟分析通过分析日志,检查存在的一些安全问题。根据菜鸟提供的标准,实现了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. jenkins展示report测试报告的配置

    HTML报告展示 1. 需要HTML Publisher plugin插件 2. 在workspace下的工程(构建)中的目录中存储测试报告 在Jenkins中新建一个job,进入配置项. 首先通过p ...

  2. Scrum Meeting 11.1

    成员 今日任务 明日计划 用时 徐越 学习利用servlet上传下载文件 代码迁移 4h 赵庶宏 数据库的连接及代码学习 数据库连接 2h 武鑫 设计界面;尝试写一些初步的代码,独立完成一些简单界面 ...

  3. 20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号:20172306 姓名:刘辰 结对伙伴博客链接 刘辰同学对编程的积极程度很高,并且在编程能力上很不错,有 ...

  4. ASP.net四则运算《《《策略模式

    Calculator.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; / ...

  5. b1

    组长:吴晓晖 过去两天完成了哪些任务: 代码重构进行中,界面,预计两个beta单位完成 展示GitHub当日代码/文档签入记录 接下来的计划 更加人性化的推荐算法 还剩下哪些任务 有哪些困难 有哪些收 ...

  6. mysql非安装包安装教程

    设置mysql的环境变量 本人设置安装的路径是:E:\WebApplication\webMySQL\mysql-5.7.13-winx64 我的电脑 ---> 高级系统配置 ---> 环 ...

  7. JAVA对象的初始化过程

    出处:http://blog.csdn.net/andrew323/article/details/4665379 下面我们通过两个例题来说明对象的实例化过程. 例1:   编译并运行该程序会有以下输 ...

  8. 浅学CSS

    CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明: 选择器通常是您需要改变样式的 HTML 元素. 每条声明由一个属性和一个值组成. 属性(property)是您希望设置的样式属性(sty ...

  9. [建树(非二叉树)] 1090. Highest Price in Supply Chain (25)

    1090. Highest Price in Supply Chain (25) A supply chain is a network of retailers(零售商), distributors ...

  10. Selenium_RC环境配置

    上一篇里,对Selenium IDE自动录制的脚本进行了一下分析,按照前两篇的操作,很明显,新建的 那个Test.py文件是不能运行的.关键问题在于1.没有装Python:2.没有装Selenium_ ...