您好,登錄后才能下訂單哦!
web教程:WebAPI 安全性 使用TOKEN+簽名驗(yàn)證(下)
//根據(jù)請(qǐng)求類型拼接參數(shù)
NameValueCollection form = HttpContext.Current.Request.QueryString;
string data = string.Empty;
switch (method)
{
case "POST":
Stream stream = HttpContext.Current.Request.InputStream;
string responseJson = string.Empty;
StreamReader streamReader = new StreamReader(stream);
data = streamReader.ReadToEnd();
break;
case "GET":
//第一步:取出所有g(shù)et參數(shù)
IDictionary parameters = new Dictionary();
for (int f = 0; f < form.Count; f++)
{
string key = form.Keys[f];
parameters.Add(key, form[key]);
}
// 第二步:把字典按Key的字母順序排序
IDictionary sortedParams = new SortedDictionary(parameters);
IEnumerator> dem = sortedParams.GetEnumerator();
// 第三步:把所有參數(shù)名和參數(shù)值串在一起
StringBuilder query = new StringBuilder();
while (dem.MoveNext())
{
string key = dem.Current.Key;
string value = dem.Current.Value;
if (!string.IsNullOrEmpty(key))
{
query.Append(key).Append(value);
}
}
data = query.ToString();
break;
default:
resultMsg = new ResultMsg();
resultMsg.StatusCode = (int)StatusCodeEnum.HttpMehtodError;
resultMsg.Info = StatusCodeEnum.HttpMehtodError.GetEnumText();
resultMsg.Data = "";
actionContext.Response = HttpResponseExtension.toJson(JsonConvert.SerializeObject(resultMsg));
base.OnActionExecuting(actionContext);
return;
}
bool result = SignExtension.Validate(timestamp, nonce, id, signtoken,data, signature);
if (!result)
{
resultMsg = new ResultMsg();
resultMsg.StatusCode = (int)StatusCodeEnum.HttpRequestError;
resultMsg.Info = StatusCodeEnum.HttpRequestError.GetEnumText();
resultMsg.Data = "";
actionContext.Response = HttpResponseExtension.toJson(JsonConvert.SerializeObject(resultMsg));
base.OnActionExecuting(actionContext);
return;
}
else
{
base.OnActionExecuting(actionContext);
}
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
}
}
然后我們進(jìn)行測(cè)試,檢驗(yàn)api請(qǐng)求的合法性
Get請(qǐng)求:
1.獲取產(chǎn)品數(shù)據(jù),傳遞參數(shù)id=1,name="wahaha" ,完整請(qǐng)求為http://localhost:14826/api/product/getproduct?id=1&name=wahaha
2.請(qǐng)求頭添加timespan,staffid,nonce,signature字段
3.如圖當(dāng)data里面的值為id1namewahaha的時(shí)候請(qǐng)求頭中的signature和服務(wù)器端計(jì)算出來(lái)的result的值是完全一樣的,當(dāng)我將data修改為id1namewahaha1之后,服務(wù)器端計(jì)算出來(lái)的簽名result和請(qǐng)求頭中提交的signature就不相同了,就表示為不合法的請(qǐng)求了
4.不合法的請(qǐng)求就會(huì)被識(shí)別為請(qǐng)求參數(shù)已被修改
post請(qǐng)求:
1.post對(duì)象序列化為json字符串后提交到后臺(tái),后臺(tái)返回相應(yīng)產(chǎn)品信息
2.后臺(tái)獲取請(qǐng)求的參數(shù)信息
3.判斷簽名是否成功,第一次請(qǐng)求簽名參數(shù)signature和服務(wù)器端計(jì)算result完全相同, 然后當(dāng)把請(qǐng)求參數(shù)中count的數(shù)量從10改成100之后服務(wù)器端計(jì)算的result和請(qǐng)求簽名參數(shù)signature不同,所以請(qǐng)求不合法,是非法請(qǐng)求,同理如果其他任何參數(shù)被修改最后計(jì)算的結(jié)果都會(huì)和簽名參數(shù)不同,請(qǐng)求同樣識(shí)別為不合法請(qǐng)求
總結(jié):
通過(guò)上面的案例,我們可以看出,安全的關(guān)鍵在于參與簽名的TOKEN,整個(gè)過(guò)程中TOKEN是不參與通信的,所以只要保證TOKEN不泄露,請(qǐng)求就不會(huì)被偽造。
然后我們通過(guò)timestamp時(shí)間戳用來(lái)驗(yàn)證請(qǐng)求是否過(guò)期,這樣就算被人拿走完整的請(qǐng)求鏈接也是無(wú)效的。
Sign簽名的方式能夠在一定程度上防止信息被篡改和偽造,保障通信的安全
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。