/// <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. [转帖]从入门到实践:创作一个自己的 Helm Chart

    从入门到实践:创作一个自己的 Helm Chart https://www.cnblogs.com/alisystemsoftware/p/11436469.html 自己已经搭建好了 helm 和t ...

  2. java中package包

    一个.java文件内部有一个.而且只能有一个public类,类名必须与文件名完全一致. 在一个.java文件的开头使用package关键字,作用是指出这个编译单元属于该package的一个库的一部分. ...

  3. 更改oracle RAC public ip,vip,scan ip和private ip

    更改oracle RAC public ip,vip,scan ip和private ip oifcfg - Oracle 接口配置工具 用法:  oifcfg iflist [-p [-n]]    ...

  4. APM之原理篇

    APM,应用性能监控,有new relic等产品,对APM感兴趣的应该不会不知道它了.主要功能就是统计分析应用的CPU.内存.网络.数据库.UI等性能,并提供错误日志捕获.编码人员需要做的仅仅是使用它 ...

  5. error LNK2001: unresolved external symbol __imp__closesocket@4

    环境:Visual C++6.0 问题:链接错误 描述: Linking... NetSrv.obj : error LNK2001: unresolvedexternal symbol __imp_ ...

  6. kmp跑两串的最大相同前后缀 HDU2594

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=2594 如题. 思路: Next数组记录的是pos位置失配时要跑到哪里,所以最后得再添加一个字符‘#’. 连 ...

  7. ORC相关的库介绍和应用

    将图像翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR) OCR库:Pillow.Tesseract.NumPy Pillow Pillow可以对图 ...

  8. selenium登录4399

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  9. Spring实战(五)Spring中条件化地创建bean

    1.@Conditional 为生成bean设置条件 Spring 4中引入了一个新的注解---@Conditional,它用在有@Bean的方法上. 如果给定条件计算结果为true,Spring会创 ...

  10. spring-boot-plus CORS跨域处理

    CORS跨域处理 CORS:Cross-Origin Resource Sharing CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domai ...