/// <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. lua table 的操作(四)

    table在前面作过介绍,它是一种关联数组,这种关联指的是可以设置各类类型的key来存储值. 1.table 间的数据传递 -- 为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b ...

  2. ubuntu中配置ip地址和上网配置

    ubuntu中的ip地址配置: 基于NAT模式: 如果能正常连接ip,但不能ping动www.baidu.com的话,我们需要在配置文件中配置主机上网的DNS地址,如下: 如果上面图片上的DNS se ...

  3. Windows32位或64位下载安装配置Scala

    [学习笔记] Windows 32位或64位下载安装配置Scala: 1)下载地址:http://www.scala-lang.org/download/,看我的spark那节,要求scala是2.1 ...

  4. DP单调队列--斜率优化P3195

    题意:https://www.luogu.com.cn/problem/P3195 思路:https://www.luogu.com.cn/problemnew/solution/P3195 #def ...

  5. vue—组件基础了解

    什么是组件? 组件是vue中的一个可复用实例,所以new Vue()是vue中最大的那个组件,根组件,有名字,使用的时候以单标签或双标签使用 vm = newVue() 是最大的组件,具有很多实用性的 ...

  6. python+pycharm+django admin css样式出问题

    最近打算学习一下Python,基础知识有了大概的了解,想上手搞搞东西. 我用的python 3.5+pycharm+django 1.11.2 在使用Django,打开127.0.0.1:8000/a ...

  7. xtrabackup原理,整库,单表,部分备份恢复

    物理备份xtrabackup原理 Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle).Pe ...

  8. element-ui组件dialog遇到form

    Vue.js似乎成了一种潮流. UI框架element-ui也跟着成了一种潮流,不过得承认,至少我个人还是非常认可的,element-ui做的是真不错. 用到element-ui,那么在dialog中 ...

  9. hdu 2066 Dijstra 堆优化

    嗯 有广搜的意思 #include<cstdio> #include<iostream> #include<queue> #include<vector> ...

  10. SpringBoot的数据访问

    一.JDBC方式 引入starter. <dependency> <groupId>org.springframework.boot</groupId> <a ...