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

    只保留三天 #!/usr/bin/env python3 # -*- coding:utf-8 -*- import os import datetime # 时间转化为字符串 now_time = ...

  2. impala 使用记录

    在命令行里面直接输入类似下面的语句,就可以执行impala sql语句. impala-shell -q "select * from xxxc limit 10;" 当用pyth ...

  3. SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换

    作者介绍 虫洞社区·签约作者 steven bai 前言 如果能够进行以太坊和比特币跨链原子资产交换,是不是一件很酷的事情? 目前链下的扩容方式有很多,最广为人知的就是比特币的闪电网络和以太坊的雷电网 ...

  4. scrapy有用的(代理,user-agent,随机延迟等)

    代理 方法一(待测试) 见scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware import os # 设置相应的代理用户名密码,主机和 ...

  5. dubbo实际应用中的完整的pom.xml

    http://blog.csdn.net/rodjohnsondoctor/article/details/39030601

  6. OO学习体会与阶段总结(设计与实现)

    前言   在最近的一个月的课程中,笔者对于规格化编程进行了深入的学习.运用面向对象抽象思想对编写的程序进行过程抽象.异常处理.数据抽象.类的层次规格与迭代等等规格设计,使得程序结构化程度提高,具有更好 ...

  7. Ubuntu下开启mysql远程访问

    1. 开启数据库3306端口 首先,使用如下指令查看3306端口是否对外开放. netstat -an | grep 3306 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LIS ...

  8. java拓荒者

    因为是初学者 最近在看那个<java从入门到精通 韩顺平>的视频 觉得好不错 虽然视频的分辨率强差人意 但仍可接受 学知识嘛 用我们广东话说 :“鬼叫你穷,顶硬上” 韩老师的声音较好 课堂 ...

  9. python learning Network Programming.py

    Socket # 用一个 Socke t表示"打开了一个网络连接" # 打开一个 Socket 需要知道目标计算机的IP地址和端口号,再指定协议类型即可. # TCP # 主动发起 ...

  10. MIT挑战(如何在12个月内自学完成MIT计算机科学的33门课程|内附MIT公开课程资源和学习顺序

    译者注:本文译自Scott H. Young的博客,Scott拥有超强的学习能力,曾在12个月内自学完成麻省理工学院计算机科学的33门课程.本文就是他个人对于这次MIT挑战的介绍和总结. 版权声明:本 ...