数字签名(Data Sign)+存取令牌(Access Token)双重安全请求WebApi接口
数字签名(Data Sign)+存取令牌(Access Token)双重安全请求WebApi接口
一、数字签名(Data Sign):接口参数防篡改机制 WebApi接口的数字签名用于接口数据安全以及用户认证防篡改。防篡改,顾名思义就是防止有人恶意篡改请求数据以达到恶意攻击的目的。 1.1 基本原理 将请求的数据加上ApiKey(公钥)、SecreKey(私钥),按规则组织成一个字符串,获取对应的MD5摘要,然后将该摘要及公钥同时作为请求的参数一起传递(私钥禁止传递)给WebApi服务器。 参考:WebApi接口安全之用户认证防篡改数字签名(Data Sign)机制 二、访问令牌(Access Token) 访问令牌(Access Tokens)是Windows操作系统安全性的一个概念。当用户登陆时,系统创建一个全局唯一标识,系统使用令牌控制用户可以访问哪些安全对象,并控制用户执行相关系统操作的能力。 Access Token是指访问令牌,在API接口编程领域,Access Token是指客户端访问资源服务器时需要带上的令牌(其实就是一段全局唯一的随机字符串),应用服务器会判断令牌是否授权(在令牌数据库中查找)。拥有这个令牌代表得到用户的授权。 微信公众平台AccessToken官方解释为: access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。 access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的 access_token失效。 2.1 Access Token的两大特性: (1)唯一有效性 通过公钥、用户、密码、私钥获取access_token,access_token的时效性可以自定义,如2个小时,超时则失效,需要重新获取 access_token。即有效的access_token只有一个。 (2)全局有效性 access_token就像是一个钥匙,可以为我们调用WebApi接口,对于全局或整个项目来说都是有效的。当用户调用后台API接口,首先会检查access_token是否存在,或是否失效过期。 CSFramework.WebApi开发框架是从缓存中获取Token数据。通过AccessTokenProvider类管理缓存数据。 Access Token生成 通过当前用户的ApiKey、用户编号、用户密码登录系统生成。 CSFramework.WebApi开发框架生成AccessToken(访问令牌)接口设计: C# Code: /// <summary> /// 获取用户的AccessToken(存取令牌) /// </summary> /// <param name="request"></param> /// <returns></returns> [HttpGet] [ActionName("get_access_token")] public IUserResponse GetAccessToken([FromUri] ModelGetAccessToken request) { if (request == null) return new ModelResponse { Code = -1, Message = "请求参数错误!" }; try { WebApiGate.CheckApiKey(request.ApiKey); //登录业务逻辑 CmdLogin cmd = new CmdLogin(this.Request); string errMsg = ""; string token = cmd.GetAccessToken(request, out errMsg); return new ModelResponse { Code = 0, Data = token,//返回token Message = errMsg, }; } catch (Exception ex) { return new ModelResponse { Code = -1, Message = ex.Message }; } } //来源:C/S框架网 | www.csframework.com | QQ:23404761 该接口采用HttpGet方式,通过URL即可获得访问令牌。 JSON Code: { "code":0, "msg":"", "data":"ED20EC32-60F3-4F08-A05F-891476367E23", "encrypt":false } //来源:C/S框架网 | www.csframework.com | QQ:23404761 序列:ED20EC32-60F3-4F08-A05F-891476367E23是当前用户的访问令牌。 客户端测试get_access_token接口: C# Code: //获取AccessToken private static string GetAccessToken() { string url = "http://localhost:19893/api/gate/get_access_token"; //接口参数 ModelGetAccessToken M = new ModelGetAccessToken { ApiKey = "api123456789", GetType = "接口访问", Password = "056d1421a6348b67f043f190fa5be2ee", UserID = "130805075338463F6F", }; //采用HTTPGET方式调用WebApi接口 string param = WebApiTools.GetUrlParam(M); string JSON = WebApiTools.Get(url, param); ModelResponse result = JsonConvert.DeserializeObject<ModelResponse>(JSON); return result.Data; } //来源:C/S框架网 | www.csframework.com | QQ:23404761 CSFramework.WebApi提供的AccessToken+DataSign双重安全机制的接口: C# Code: /// <summary> /// 接口参数数字签名(Data Sign)+存取令牌(Access Token)双重安全请求WebApi接口 /// </summary> /// <param name="request"></param> /// <returns></returns> [HttpPost] [ActionName("test_access_token")] public IUserResponse TestAccessToken(ModelRequestTokenSign request) { if (request == null) return new ModelResponse { Code = -1, Message = "请求参数错误!" }; try { //检查数字签名,若不成功抛出异常! WebApiGate.CheckSignature(request.ApiKey, request.Data, request.Timestamp, request.Sign); //检查AccessToken, 若不成功抛出异常! WebApiGate.CheckAccessToken(request.Token); return new ModelResponse { Code = 0, Message = "操作成功!" }; } catch (Exception ex) { return new ModelResponse { Code = -1, Message = ex.Message }; } } //来源:C/S框架网 | www.csframework.com | QQ:23404761 客户端测试AccessToken+DataSign双重安全机制的接口: C# Code: public static void TestSignAccessToken() { Console.WriteLine("##########################################"); Console.WriteLine("数字签名(Data Sign)+存取令牌(Access Token)双重安全请求WebApi接口"); Console.WriteLine("www.csframework.com | C/S框架网"); Console.WriteLine("##########################################"); Console.WriteLine(""); string url = "http://localhost:19893/api/gate/test_access_token"; string token = GetAccessToken();//获取AccessToken ModelRequestTokenSign M = new ModelRequestTokenSign { Timestamp = DateTime.Now.ToString("yyyyMMddHHmmss"),//时间戳 ApiKey = "api123456789", Data = "{客户端提交的数据}", Token = token, //Token = "234523452345",//测试错误的AccessToken令牌 Sign = "", }; //生成MD5签名 M.Sign = CryptoHelper.ToMD5(M.ApiKey + M.Data + "sec987654321" + M.Timestamp);//Sign数字签名 string json = JsonConvert.SerializeObject(M, JsonSettings.Current); string result = WebApiTools.Post(url, json); Console.WriteLine(result); } //来源:C/S框架网 | www.csframework.com | QQ:23404761 ASP.NET WebApi快速开发框架|APP后端框架-标准版V1.0 适用开发:快速搭建APP、B/S、C/S、微信小程序、公众号、Web站点等后端应用服务程序。 运行平台:Windows + .NET Framework 4.5 开发工具:Visual Studio 2015+,C#语言 数据库:Microsoft SQLServer 2008R2+(支持多数据库:Oracle/MySql) CSFramework.WebApi开发框架详情:
参考文档:
打开设计窗体报错:To prevent possible data loss before loading the designer C#数据访问层主类.(SqlHelper)SQLDataAccess.cs C#.NET史上最全字符串加密/解密/数字签名工具(CryptoHelper.cs) DbProviderFactories 加载Oracle.DataAccess.Client 失败 LianLianPay连连支付数字签名验签工具C#源码 登录失败,请检查用户名和密码!CSFrameworkV5.DataAccess.DALFactory的类型初始值设定项引发异常 CSFramework.WebApi后端服务器框架:客户端调用WebApi接口方式(签名+Token令牌) CSFramework.WebApi令牌管理器(Token Provider)实现添加、删除、刷新令牌过期控制 【原创】WebApi开发框架:Token生成、Token缓存原理、Token验证、令牌机制与原理 CSFramework.WebApi后端框架Token令牌体系架构与应用详解 使用DataBinderTools工具类绑定下拉LookupEdit组件数据源 CG_LookupDataBoundAttribute类详解 DataTable已属于另一个DataSet C# 生成日期时间数字唯一序号,尾部添加指定位数长度的随机码 WebApi接口安全之用户认证防篡改数字签名(Data Sign)机制
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |