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

    5.2条件测试 使用==判断相当: 使用!=判断不相等: 每条if语句的核心都是一个值为Tre或False的表达式,这种表达式被称为条件测试,如果条件测试的值为Ture,则执行紧跟在if语句后面的代码 ...

  2. MyBatis思维导图

    1.初识框架技术 2.搭建MyBatis环境 3.掌握MyBatis的核心API 4.掌握MyBatis的核心配置文件:主要用于配置数据库连接和MyBatis运行时所需的各种特性 5.掌握SQL映射文 ...

  3. Daily Scrum (2015/11/8)

    由于编译大作业临近deadline以及各项选修课即将结课,虽然PM强调软工任务也很紧迫,但是大多数成员表示今天想请假一天.符美潇今天把自己所负责的数据库编码部分和谢金洛的UI进行了对接.在测试过程中发 ...

  4. 第一节 Linux系统简介

    一.Linux定义 Linux 是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS. 操作系统在整个计算机系统中的角色: Linux 是系统调用和内核那两层,直观的来 ...

  5. C++:构造函数2——拷贝构造函数

     前言:拷贝构造函数是C++中的重点之一,在这里对其知识进行一个简单的总结. 一.什么是拷贝构造函数 在C++中,对于内置类型的变量来说,在其创建的过程中用同类型的另一个变量来初始化它是完全可以的,如 ...

  6. HDU 5925 Coconuts 离散化

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5925 Coconuts Time Limit: 9000/4500 MS (Java/Others) ...

  7. 灵悟礼品网上专卖店——画出E-R图

    一.小组成员: 洪雪意(产品负责人) 陈淑筠(Master) 二.组内人员任务情况 计划完成的任务的第三个模块:分析并建立数据库 已完成的任务: 任务的第三个模块: 陈淑筠(完成任务1):画出商品资料 ...

  8. Arduino Leonardo读取DHT22温湿度传感器

    首先在该地址下载库:https://codeload.github.com/nethoncho/Arduino-DHT22/zip/master 使用以下代码测试: /**************** ...

  9. 第九周(11.11-11.17)----Beta版本视频发布

    beta阶段视频发布地址: http://v.youku.com/v_show/id_XMTgxNjE2NzY3Mg==.html

  10. [转帖]ssd固态硬盘的Trim命令是什么?

    ssd固态硬盘的Trim命令是什么?  收藏 分享 邀请 许多用户朋友在购买SSD的时候都会特别强调Trim,不过Trim是什么?做什么用的?   什么是Trim?   Trim指令也叫disable ...