WebApiHelper
/// <summary>
/// 根据token过滤
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
private List<train_code_list> GetListByToken(List<train_code_list> list)
{
//token
var token = System.Web.HttpContext.Current.Request.Headers["Token"];
if (!string.IsNullOrEmpty(token))
{
var station = (new DESHelper().DecryptString(((new DESHelper().DecryptString(token, DESHelper.key, DESHelper.iv)).Split('/')[]), DESHelper.key, DESHelper.iv));
list = list.Where(c => c.Detail.Any(p => p.station_name == station)).ToList();
}
return list;
}
/// <summary>
/// 获取随机码
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public ResultMsg GetRandom(authentication data)
{
var resultMsg = new ResultMsg() { Status = false, Info = "", Data = data };
try
{
if (string.IsNullOrEmpty(data.UniqueCode))
{
resultMsg.Info = "唯一码为空!";
return resultMsg;
}
if (string.IsNullOrEmpty(data.PID))
{
resultMsg.Info = "PID为空!";
return resultMsg;
}
if (string.IsNullOrEmpty(data.PIN))
{
resultMsg.Info = "PIN为空!";
return resultMsg;
} var query = Query.And(Query.EQ("UniqueCode", data.UniqueCode),Query.EQ("PID", data.PID),Query.EQ("PIN", data.PIN));
if (Mb.FindOne<authentication>(query) != null)
{
var strRandom= getStr();
if (Mb.Update<authentication>(query, Update.Set("RandomDigit", strRandom)))
{
resultMsg.Status = true;
resultMsg.Data = strRandom;
}
else
{
resultMsg.Info = "保存随机数失败!";
}
}
else
{
resultMsg.Info = "提供的信息在数据库中不存在!";
}
}
catch (Exception ex)
{
resultMsg.Info = ex.Message;
}
return resultMsg;
}
/// <summary>
/// 获取token
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public ResultMsg GetToken(authentication data)
{
var resultMsg = new ResultMsg() { Status = false, Info = "", Data = data };
try
{
if (string.IsNullOrEmpty(data.UniqueCode))
{
resultMsg.Info = "唯一码为空!";
return resultMsg;
} if (string.IsNullOrEmpty(data.EncryptedStorage))
{
resultMsg.Info = "加密存储区信息为空!";
return resultMsg;
} var auth = Mb.FindOne<authentication>(Query.EQ("UniqueCode", data.UniqueCode)); if (auth != null)
{
if (data.EncryptedStorage.Replace("\0", "") != auth.EncryptedStorage)
{
resultMsg.Info = "加密存储区信息与数据库中信息不匹配!";
return resultMsg;
}
if (!ValidateMsg(auth, data.EcryptedSMS, resultMsg))
{
return resultMsg;
} if (Mb.Remove<token>(Query.EQ("UniqueCode", data.UniqueCode)))
{
var token = new token()
{
UniqueCode = data.UniqueCode,
SignToken = new DESHelper().EncryptString(data.UniqueCode + "/" + Guid.NewGuid().ToString() + "/" + DateTime.Now.AddHours().ToString("yyyy-MM-dd HH:mm:ss")
+"/"+ auth.EncryptedStorage, DESHelper.key, DESHelper.iv)
}; //插入数据库
if (Mb.Insert<token>(token))
{
resultMsg.Status = true;
resultMsg.Data = token.SignToken;
}
else {
resultMsg.Info = "保存新的token发生异常!";
}
}
else {
resultMsg.Info = "删除旧的token发生异常!";
}
}
else{
resultMsg.Info = "提供的信息在数据库中不存在!";
}
}
catch (Exception ex)
{
resultMsg.Info = ex.Message;
}
return resultMsg;
}
/// <summary>
/// 验证token
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public ResultMsg ValidateToken(string data)
{
var resultMsg = new ResultMsg() { Status = false, Info = "", Data = data };
try
{
var arrToken = (new DESHelper().DecryptString(data, DESHelper.key, DESHelper.iv)).Split('/'); if (arrToken.Length != )
{
resultMsg.Info = "token无效";
return resultMsg;
}
var auth = Mb.FindOne<authentication>(Query.And(Query.EQ("UniqueCode", arrToken[]), Query.EQ("EncryptedStorage", arrToken[].Replace("\0", ""))));
if (auth==null)
{
resultMsg.Info = "加密存储区信息与数据库中信息不匹配";
return resultMsg;
}
if (DateTime.Now.CompareTo(Convert.ToDateTime(arrToken[])) >= )
{
Mb.Update<authentication>(Query.EQ("UniqueCode", arrToken[]), Update.Set("RandomDigit", ""));
//token失效
resultMsg.Info = "token失效";
return resultMsg;
} var Info = Mb.FindOne<token>(Query.EQ("UniqueCode", arrToken[]));
if (Info != null && Info.SignToken == data)
{
resultMsg.Status = true;
}
else
{
//token无效
resultMsg.Info = "token无效";
}
}
catch (Exception ex)
{
resultMsg.Info = ex.Message;
}
return resultMsg;
}
/// <summary>
/// 对比加密信息
/// </summary>
/// <param name="auth"></param>
/// <param name="ecryptedSMS"></param>
/// <param name="resultMsg"></param>
/// <returns></returns>
private bool ValidateMsg(authentication auth, string ecryptedSMS, ResultMsg resultMsg)
{
if (string.IsNullOrEmpty(auth.RandomDigit))
{
resultMsg.Info = "随机码为空!";
return false;
}
if (string.IsNullOrEmpty(auth.Key))
{
resultMsg.Info = "秘钥为空!";
return false;
} //服务端软件计算秘钥信息
byte[] bytRandomCode;
string strRandomCode = auth.RandomDigit;
bytRandomCode = new byte[strRandomCode.Length];
bytRandomCode = System.Text.Encoding.ASCII.GetBytes(strRandomCode);
String strMD5Key = auth.Key;
byte[] bytShortKey;
bytShortKey = new byte[strMD5Key.Length];
bytShortKey = System.Text.Encoding.ASCII.GetBytes(strMD5Key);
byte keylen = byte.Parse(strMD5Key.Length.ToString());
byte randomlen = byte.Parse(strRandomCode.Length.ToString()); byte[] sbMd5Key = new byte[];
byte[] sbdigest = new byte[]; uint s_MD5_result = ET99_API.MD5_HMAC(ref bytRandomCode[], strRandomCode.Length, ref bytShortKey[], strMD5Key.Length, out sbMd5Key[], out sbdigest[]);
if (s_MD5_result != ET99_API.ET_SUCCESS)
{
resultMsg.Info = "计算加密信息失败!";
return false;
}
//获取 SN到文本
string strSoftDigest = "";
for (int i = ; i < ; ++i)
{
strSoftDigest += string.Format("{0:X2}", sbdigest[i]);
} //与客户端的加密信息进行对比
if (strSoftDigest != ecryptedSMS)
{
resultMsg.Info = "认证失败!";
return false;
} return true;
}
/// <summary>
/// 时间转化
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public string GetDateTime(string dateTime)
{
DateTime result;
if (!DateTime.TryParse(dateTime, out result))
{
dateTime = DateTime.Now.ToString("yyyy-MM-dd");
}
else
{
dateTime = result.ToString("yyyy-MM-dd");
}
return dateTime;
}
/// <summary>
/// 自定义WebApi返回类型
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static HttpResponseMessage toJson(Object obj)
{
String str;
if (obj is String || obj is Char)
{
str = obj.ToString();
}
else
{
str = JsonConvert.SerializeObject(obj);
}
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
/// <summary>
/// 获取随机数
/// </summary>
/// <param name="len"></param>
/// <returns></returns>
public string getStr(int len)
{
string str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuilder sb = new StringBuilder();
Random rd = new Random();
for (int i = ; i < len; i++)
{
sb.Append(str.Substring(rd.Next(, str.Length), ));
}
return sb.ToString();
}
测试webapi使用Postman这个工具
WebApiHelper的更多相关文章
- WebApi基于Token和签名的验证
最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久 ...
- 封装WebAPI客户端,附赠Nuget打包上传VS拓展工具
一.前言 上篇< WebAPI使用多个xml文件生成帮助文档 >有提到为什么会出现基于多个xml文件生成帮助文档的解决方案,因为定义的模型可能的用处有: 1:单元测试 2:其他项目引用(可 ...
- .Net Oauth2.0 第三方登录开发(Facebook ,LinkedIn )
需求:OAuth2实现第三方网站授权并获取其相关数据来实现登录等功能 暂时支持Facebook ,LinkedIn ,基本大同小异,只是返回时的数据不同,需根据具体返回类型进行相应处理 1.OAuth ...
- WebAPI客户端
封装WebAPI客户端,附赠Nuget打包上传VS拓展工具 一.前言 上篇< WebAPI使用多个xml文件生成帮助文档 >有提到为什么会出现基于多个xml文件生成帮助文档的解决方案,因为 ...
- Nginx集群之SSL证书的WebApi令牌验证
目录 1 大概思路... 1 2 Nginx集群之SSL证书的WebApi令牌验证... 1 3 Openssl生成SSL证书... 2 4 编写.NE ...
- Nginx集群之基于Redis的WebApi身份验证
目录 1 大概思路... 1 2 Nginx集群之基于Redis的WebApi身份验证... 1 3 Redis数据库... 2 4 Visualbox ...
- WebAPI调用笔记
前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于Http协议的Get.Po ...
- C# HttpClient请求Webapi帮助类
引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
随机推荐
- oracle 创建新用户,授权dba
1.用有dba权限的用户登录:sys用户 2.创建一个新用户:create user abc identified by 123456; 3.授予DBA权限: grant connect,resour ...
- ubuntu18安装PacketTracer-7.2.2
1.下载需要先注册个账号 https://www.netacad.com/zh-hans/courses/packet-tracer 2.运行.run文件 chmod +x PacketTracer ...
- Ural 1201 Which Day Is It? 题解
目录 Ural 1201 Which Day Is It? 题解 题意 输入 输出 题解 程序 Ural 1201 Which Day Is It? 题解 题意 打印一个月历. 输入 输入日\((1\ ...
- linux学习笔记(1) -- 关于命令的一些操作
Linux 目录 /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录.所有的东西都是从这里开始.当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到ho ...
- Django-djangorestframework-响应模块
响应模块 一般都用 Response 对象来做返回(最后一定是打包成符合 HTTP 协议的数据格式来传输,Response 类做了一系列处理,所以这里我们只需要关注下它的那些参数即可) 响应类构造器 ...
- 【转】Entity Framework 6 Code First 实践系列(1):实体类配置-根据依赖配置关系和关联
本文转自:http://www.cnblogs.com/easygame/p/3622893.html EF实体类的配置可以使用数据注释或Fluent API两种方式配置,Fluent API配置的关 ...
- nginx日志模块、事件模块
日志模块 1.access_log指令 语法: access_log path [format [buffer=size [flush=time]]]; access_log logs/access. ...
- css鼠标悬浮控制元素隐藏与显示
在网页开发中经常有需求是鼠标移动到一个元素A身上时,另外一个元素B显示. 如下图 当鼠标移到图片上时,相关的描述从下方显示出来. css实现原理与情景: A 是 B 的父元素 B 默认隐藏 B{opa ...
- Eclipse中项目本身没有问题,可是工程名却有红色小叉叉解决办法
右击项目“Properties”,在弹出的“Properties”的左侧边框,单击“Project Facets”,打开“Project Facets”页面, 在页面中“Java”下拉选项中,选择与自 ...
- 微信小程使用getCurrentPages函数操作父级数据
微信小程使用getCurrentPages函数操作父级数据 let pages = getCurrentPages(); let prevPage = pages[pages.length - 2]; ...