数字签名(Data Sign)+存取令牌(Access Token)双重安全请求WebApi接口
数字签名(Data Sign)+存取令牌(Access Token)双重安全请求WebApi接口
返回结果:
CSFramework.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
/// <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
"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
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
/// <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
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)
运行平台:Windows + .NET Framework 4.5
开发工具:Visual Studio 2015+,C#语言
数据库:Microsoft SQLServer 2008R2+(支持多数据库:Oracle/MySql)
CSFramework.WebApi开发框架详情:
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网