文章来源于 :http://lesg.cn/?p=122 我的个人博客站点

对于一些Http远程连接Api安全的看法;

当不同系统需要互相通信的时候;如果无法用webservice等方式链接的时候另一种方式就是采用Http通信了;

如果有用过短信API的同学应该知道;大部分都是使用HttpPost 的方式来发送短信给客户的,那么怎么保证这个数据是安全的;

对此小弟有一些小见解,请大家拍砖;

例子:

某公司需要开发一个转盘抽奖的活动;但是两个系统又要分开;

A端是发送请求数据的服务器; B端是接收数据和返回结果的服务器;

我的解决思路是这样的;

首先A端口发送一个Post到B端 Post采用Key的方式; Key的值为 用户id,Key加密(user,key+日期格式化成YYMMddYY ;采用字符串分隔)

/*A端部分请求代码*/

var nuserid = User.Identity.Name;
dic.Add("id", DESEncrypt.Encrypt(nuserid + "," + OtherConfigs.ENT_KEY + DateTime.Now.ToString(OtherConfigs.ENT_DT_FONT))); var res = HttpHelp.CreatePostHttpResponse("https:///****.com/goto/CjValidateToken", dic, null, null, Encoding.UTF8, null);

发送验证请求到B端

B端收到请求后;解析Key,取出字符串分隔中的Key对比Key;之后将userid保存到Redis中并生产一串GUID返回给A端

/*B端部分解析代码*/

if(!Comm.ValidateKey(id,out userid,out msg)) //验证key的正确性
{
return msg;
} var tokenName = Guid.NewGuid().ToString("n"); //创建一串GUID RedisStrOp.SetString(tokenName, userid); //以 GUID为Key 存入Userid return resToken + tokenName; //返回结果+GUID

A端收到B端的返回代码之后解析

并使用GUID直接 HTTP Get 跳转到 B端的另一个验证端

/*A端的跳转代码 */

return Redirect("https://***.com/goto/Cj/" + token);

B端的另一个验证端接收到A端的GUID后马上解析GUID; 从Redis中得到UserID;

判断此UserID是否存在系统的数据库中(即此用户是否为真实存在的用户)

/// <summary>
/// 针对m 和 www 跳转捡来
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public ActionResult Cj(string id)
{
var token = id ?? "";
if (string.IsNullOrEmpty(id))
return Redirect("/Pay/Msg/不合法参数");
var userid = RedisStrOp.GetString(id);
if (string.IsNullOrEmpty(userid))
return Redirect("/Pay/Msg/系统参数超时;请重新进入此页面");
var exists = false;
using (var db = new SqlDbOperates())
{
db.ConditionExpress = "userid=@userid";
db.AddConditionParameter("@userid", userid);
exists = db.Exist("A端口user_table");
}
if(!exists)
return Redirect("/PayStart/Msg/此用户不存在");
Session["userid"] = userid;
Session["login"] = true;
SLogin(userid, ""); //调用Authorize 的登录方法
return Redirect("/Pay/index");
}

最终跳转到B端的抽奖页面

其他方面使用IP白名单;只有指定的IP才可以访问

04-28 08:07