数字签名(Data Sign)+存取令牌(Access Token)双重安全请求WebApi接口
作者:作者不详  发布日期:2020/12/03 14:03:35
  数字签名(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 == nullreturn 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)

ASP.NET WebApi快速开发框架|MVC框架|APP微信小程序后端框架|服务端框架-标准版V1.0



CSFramework.WebApi开发框架详情:

上一篇 下一篇