/// <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的更多相关文章

  1. WebApi基于Token和签名的验证

    最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久 ...

  2. 封装WebAPI客户端,附赠Nuget打包上传VS拓展工具

    一.前言 上篇< WebAPI使用多个xml文件生成帮助文档 >有提到为什么会出现基于多个xml文件生成帮助文档的解决方案,因为定义的模型可能的用处有: 1:单元测试 2:其他项目引用(可 ...

  3. .Net Oauth2.0 第三方登录开发(Facebook ,LinkedIn )

    需求:OAuth2实现第三方网站授权并获取其相关数据来实现登录等功能 暂时支持Facebook ,LinkedIn ,基本大同小异,只是返回时的数据不同,需根据具体返回类型进行相应处理 1.OAuth ...

  4. WebAPI客户端

    封装WebAPI客户端,附赠Nuget打包上传VS拓展工具 一.前言 上篇< WebAPI使用多个xml文件生成帮助文档 >有提到为什么会出现基于多个xml文件生成帮助文档的解决方案,因为 ...

  5. Nginx集群之SSL证书的WebApi令牌验证

    目录 1       大概思路... 1 2       Nginx集群之SSL证书的WebApi令牌验证... 1 3       Openssl生成SSL证书... 2 4       编写.NE ...

  6. Nginx集群之基于Redis的WebApi身份验证

    目录 1       大概思路... 1 2       Nginx集群之基于Redis的WebApi身份验证... 1 3       Redis数据库... 2 4       Visualbox ...

  7. WebAPI调用笔记

    前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于Http协议的Get.Po ...

  8. C# HttpClient请求Webapi帮助类

    引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...

  9. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

随机推荐

  1. [转帖]Linux日期和时间的那些事儿

    Linux日期和时间的那些事儿 http://embeddedlinux.org.cn/emb-linux/entry-level/201311/09-2672.html 自己还是稚嫩啊.. 除了年龄 ...

  2. javaweb配置连接mysql数据库

    1.首先新建基础连接类BaseDao,在这里配置链接的数据库名称,用户名以及密码,以及执行读与写操作的父方法,代码如下: package com.demo.dao; import java.sql.D ...

  3. spark调优篇-Spark ON Yarn 内存管理(汇总)

    本文旨在解析 spark on Yarn 的内存管理,使得 spark 调优思路更加清晰 内存相关参数 spark 是基于内存的计算,spark 调优大部分是针对内存的,了解 spark 内存参数有也 ...

  4. easyui-combobox多选时的小问题

    easyui-combobox可支持多选,仅需将multiple值设为true即可 $('#combobox').combobox({ url:url, multiple:true, separato ...

  5. ide的debug

    webstom 新建立一个配置项 找到webpack.config.js,最后一行加上 devtool: "source-map" 然后点击debug

  6. win10系统查看激活状态及是否永久激活

    查看windows系统是否激活 找到“此电脑”,右击“属性” 查看windows系统是否永久激活 第一种方法 win+r 进入运行,输入slmgr.vbs -xpr  如图,再点击确定. 弹出一个对话 ...

  7. 美团CodeM初赛B轮 合并字符串的价值 (线段树,分类讨论)

    输入两个字符串a和b,合并成一个串c,属于a或b的字符在c中顺序保持不变.如"ACG"和"UT"可以被组合成"AUCTG"或"AC ...

  8. Angular6如何引入jQuery-knob

    Angular6如何引入jQuery-knob 1.概述 Angular6引入jQuery变得异常简单,请参考https://blog.csdn.net/qq_35321405/article/det ...

  9. JS笛卡尔积算法与多重数组笛卡尔积实现方法示例

    js 笛卡尔积算法的实现代码,据对象或者数组生成笛卡尔积,并介绍了一个javascript多重数组笛卡尔积的例子,以及java实现笛卡尔积的算法与实例代码. 一.javascript笛卡尔积算法代码 ...

  10. Django + mysql 在创建数据库出错

    错误:django.db.utils.OperationalError: (1366, "Incorrect string value: '\\xE6\\x96\\x87\\xE7\\xAB ...