gSOAP 原始碼分析 四

2021-06-06 21:34:16 字數 3340 閱讀 7870

gsoap 原始碼分析(四) 

2012-6-2 邵盛松

前言本文主要說明gsoap中對client的認證分析

gsoap中包含了http基本認證,ntlm認證等,還可以自定義soap heard實現認證等

一 http基本認證

client在向server傳送請求時提供以使用者名稱和口令形式的憑證

gsoap中對應 使用者名稱是userid,密碼是passwd

使用者名稱和密碼採用base64編碼

處理base64編碼

soap_fmac1 int soap_fmac2 soap_putbase64(struct soap*, const

unsigned

char*, int);

soap_fmac1 unsigned

char* soap_fmac2 soap_getbase64(struct soap*, int*, int);

(查標籤的含義authorization

basic *

www-authenticate

proxy-authenticate

expect

100-continue

gsoap原始碼中http基本認證部分

else

if (!soap_tag_cmp(key, "authorization"))

{ if (!soap_tag_cmp(val, "basic *"))

{ int n;

char *s;

soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n);

soap->tmpbuf[n] = '\0';

if ((s = strchr(soap->tmpbuf, ':')))

{ *s = '\0';

soap->userid = soap_strdup(soap, soap->tmpbuf);

soap->passwd = soap_strdup(soap, s + 1);

client用冒號將使用者名稱和密碼連線在一起,並以base64演算法進行編碼,傳輸到server

從http頭中找到authorization: basic 標籤,使用soap_base642s將base64編碼轉換為字串,strchr找到冒號(:)的位置然後擷取,分解出了soap->userid 使用者名稱和soap->passwd 密碼,然後由server驗證

二 ntlm認證

gsoap提供了ntlm認證方式

ntlm是nt lan manager的縮寫,如果想要**支援ntlm認證需要增加#define with_ntlm

認證原理圖如下

domain中存在乙個資料庫,該資料庫儲存屬於這個domain計算機的使用者名稱 密碼hash值等資訊

1 client開機的時候,需要輸入使用者名稱和密碼,假設輸入的使用者名稱是admin,密碼是123456,那麼作業系統會將123456加密,儲存密碼的雜湊值假設為h1,為了安全原密碼123456會被丟棄

2 client向server傳送請求,請求中包含admin這個使用者名稱

3 server接收到請求後,生成乙個16位的隨機數。這個隨機數被稱為challenge或者nonce,

server先將server儲存起來,然後以明文的方式傳送給client,gsoap對應的challenge是ntlm_challenge

4 client在接收到server發回的challenge後,用h1對其加密,然後再將加密後的challenge(h2) 傳送給server

5 server接收到client傳送回來的加密後的challenge後,會向domain傳送針對client的驗證請求。該請求主要包含以下三方面的內容:client的使用者名稱;client的密碼雜湊值加密的challenge(h2)和原始的challenge。

6 domain根據使用者名稱獲取該帳號的密碼雜湊值,對原始的challenge進行加密生成h3。如果加密後的challenge(h3)和server傳送的(h2)一致,則意味著使用者擁有正確的密碼,驗證通過,否則驗證失敗。domain將驗證結果發給server,並最終由server反饋給client

**中對應變數宣告 

三 gsoap可以擴充套件soapheader,對client進行驗證

gsoap繫結了http,訊息標識和訊息關聯都在http中,所以gsoap中關於soap header的結構

只有乙個虛設的成員變數,這個結構體屬於虛設**(dummy code)

struct soap_env__header

#ifdef with_noemptystruct

private:

char dummy; /* dummy member to enable compilation */

#endif

soap中可以繫結去其他協議,如果協議中不提供soap header可以對soap進行擴充,利用soap header實現訊息標識和訊息關聯

四 其他

在每乙個client連線server時,都提供了自身的ip,server可以指定允許連線到server的ip

只要在calcservice這個封裝類accept()的新增

soap_socket calcservice::accept()

cstring strip=_t("");

strip.format(_t("客戶端的ip是%d.%d.%d.%d"),((this->ip)>>24)&0xff,((this->ip)>>16)&0xff,((this->ip)>>8)&0xff,((this->ip))&0xff);

afxmessagebox(strip);//這裡增加ip的對比

return soap_accept(this);

gSOAP 原始碼分析 三

gsoap 原始碼分析 三 2012 5 25 flyfish 一 http請求方法 get 請求獲取 request uri 所標識的資源 post 在 request uri 所標識的資源後附加新的資料 head 請求獲取由 request uri 所標識的資源的響應訊息報頭 put 請求伺服器...

gSOAP 原始碼分析 一

gsoap 原始碼分析 一 邵盛松 2012 5 22 一 soap 訊息結構 soap訊息包括以下元素 必需的 envelope 元素,可把此 xml 文件標識為一條 soap 訊息,xml檔案的頂層元素,代表該檔案為 soap 訊息可選的 header 元素,包含頭部資訊 必需的 body 元素...

uC OS II原始碼分析(四)

核心結構 1,臨界區,os enter critical 和os exit critical 為了處理臨界區 必須關中斷,等處理完畢後,再開中斷。關中斷可以避免其他任務或中斷進入臨界區 uc os ii 定義了這兩個巨集來實現,但注意一條 呼叫 uc os ii 功能函式時,中斷應該總是開著的。1 ...