/// <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. fcntl和flock两个系统调用的区别

    总的来说,flock函数只能锁定整个文件,无法锁定文件的某一区域.而fcntl可以利用struct flock结构体,来实现文件里部分区域锁定的操作. 附:fcntl(文件描述词操作) 相关函数 op ...

  2. mac更新后,xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

    解决方案: xcode-select --install

  3. 【51nod】2590 持续讨伐

    [51nod]2590 持续讨伐 挣扎着卡了卡常过了 记\(dp[i][j]\)为到第\(i\)位,和第\(i\)位相连的部分长度\(x^{j}\)乘上之前部分所有方案\(x^{K}\)总和 转移用二 ...

  4. .Net Core 3.0原生Json解析器

    微软官方博客中描述了为什么构造了全新的Json解析器而不是继续使用行业准则Json.Net 微软博客地址:https://devblogs.microsoft.com/dotnet/try-the-n ...

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

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

  6. 6.Linux查看哪个进程占用磁盘IO

    $ iotop -oP命令的含义:只显示有I/O行为的进程

  7. 1-MySQL DBA笔记-理解MySQL

    第一部分 入门篇 本篇首先介绍MySQL的应用领域.基础架构和版本,然后介绍MySQL的基础知识,如查询的执行过程.权限机制.连接.存储引擎,最后阐述一些基础概念. 第1章 理解MySQL 本章将介绍 ...

  8. intellij IDE 破解 简单 License server 法

    http://idea.iteblog.com/key.php

  9. 查找最大和次大元素(JAVA版)(分治法)

    问题描述:对于给定的含有n个元素的无序序列,求这个序列中最大和次大的两个不同元素. 问题求解分析(分治法):先给出无序序列数组a[low...high].第一种情况为当数组中只有一个元素时,此时只存在 ...

  10. 【php设计模式】模板模式

    定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤. 通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同 ...