溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

WebAPI 安全性 使用TOKEN+簽名驗(yàn)證(下)

發(fā)布時(shí)間:2020-06-28 18:40:30 來(lái)源:網(wǎng)絡(luò) 閱讀:4770 作者:IT大贏家 欄目:開(kāi)發(fā)技術(shù)

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

  WebAPI 安全性 使用TOKEN+簽名驗(yàn)證(下)

  2.請(qǐng)求頭添加timespan,staffid,nonce,signature字段

  WebAPI 安全性 使用TOKEN+簽名驗(yàn)證(下)

  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)求了

  WebAPI 安全性 使用TOKEN+簽名驗(yàn)證(下)

  4.不合法的請(qǐng)求就會(huì)被識(shí)別為請(qǐng)求參數(shù)已被修改

  WebAPI 安全性 使用TOKEN+簽名驗(yàn)證(下)

  post請(qǐng)求:

  1.post對(duì)象序列化為json字符串后提交到后臺(tái),后臺(tái)返回相應(yīng)產(chǎn)品信息

  WebAPI 安全性 使用TOKEN+簽名驗(yàn)證(下)

  2.后臺(tái)獲取請(qǐng)求的參數(shù)信息

  WebAPI 安全性 使用TOKEN+簽名驗(yàn)證(下)

  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)求

  WebAPI 安全性 使用TOKEN+簽名驗(yàn)證(下)

  總結(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簽名的方式能夠在一定程度上防止信息被篡改和偽造,保障通信的安全


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI