gSOAP 源码分析(四)

2012-6-2 邵盛松

前言

本文主要说明gSOAP中对Client的认证分析

gSOAP中包含了HTTP基本认证,NTLM认证等,还可以自定义SOAP Heard实现认证等

一 HTTP基本认证

Client在向Server发送请求时提供以用户名和口令形式的凭证

gSOAP中对应 用户名是userid,密码是passwd

const char *userid; /* HTTP Basic authorization userid */

const char *passwd; /* HTTP Basic authorization 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

代码中对应变量声明

const char *authrealm; /* HTTP authentication realm (NTLM domain) */

const char *ntlm_challenge; /* HTTP NTLM challenge key string */

short ntlm_auth; /* HTTP NTLM authentication type */

short ntlm_stage; /* HTTP NTLM stage 0..3 */

三 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 源码分析(四)相关推荐

  1. gSOAP 源码分析(二)

    gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...

  2. ABP源码分析四十七:ABP中的异常处理

    ABP源码分析四十七:ABP中的异常处理 参考文章: (1)ABP源码分析四十七:ABP中的异常处理 (2)https://www.cnblogs.com/1zhk/p/5538983.html (3 ...

  3. 【投屏】Scrcpy源码分析四(最终章 - Server篇)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  4. Spring 源码分析(四) ——MVC(二)概述

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) from:Spring 源码分析(四) --MVC(二)概述 - 水门-kay的个人页面 - OSCHINA ...

  5. 【转】ABP源码分析四十七:ABP中的异常处理

    ABP 中异常处理的思路是很清晰的.一共五种类型的异常类. AbpInitializationException用于封装ABP初始化过程中出现的异常,只要抛出AbpInitializationExce ...

  6. 【转】ABP源码分析四:Configuration

    核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...

  7. 谷歌chrome浏览器的源码分析(四)

    上一次说到需要调用这个OpenURLFromTab函数,那么这个函数是做什么的呢?从名称上可能猜到它是打开网页,但是是从目前TAB页里打开呢?还是新建一个?或者使用每个TAB页一个进程呢?这些疑惑,只 ...

  8. 【转】ABP源码分析四十六:ABP ZERO中的Ldap模块

    通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供Defaut ...

  9. 【转】ABP源码分析四十五:ABP ZERO中的EntityFramework模块

    AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...

最新文章

  1. Python--编码的疑惑
  2. java占位符填充_程序员:深入理解Java虚拟机,对象的内存布局
  3. shell+中sum的用法_使用shell进行计算
  4. iphone配置实用工具出错解决
  5. 任务含有时间窗与资源含有上下班时间的时间冲突约束构建思路
  6. 动画开发之PIXI开发
  7. 20.Consent Controller Get请求逻辑实现
  8. Swift语言入门学习
  9. 【appium报错】Original error:Could not proxy command to remote server. Original error:socket hang up
  10. 数据预处理——数据清洗
  11. ALBERT: 轻量级的BERT
  12. 雀巢旗下巧克力品牌芭绮正式进入中国;国内首款工业级防水机器狗“绝影X20”亮相 | 美通社头条...
  13. 空格键 还是 Tab键?
  14. 华为铁三角:浅聊铁三角模式的角色边界
  15. win2012 php5.2,windows2012core下php5.5兼容mssql数据库 (完美WASP环境搭建)
  16. list-style和list-style-type
  17. 前端——》H5页面实现按钮呼吸特效
  18. 请看这里!!!leetcode题目目录!!!
  19. AR/VR中使用Overlay提升清晰度
  20. WPS Office之Word文字域代码与查询-陈慧-专题视频课程

热门文章

  1. ERTEC200P-2 PROFINET设备完全开发手册(9-2)
  2. CAD高版本转低版本的方法有哪些?
  3. pycharm找不到conda可执行文件
  4. python回调廖雪蜂_Python 廖雪峰教程《三》
  5. vue可视化拖拽组件模板,vue组件拖拽自定义界面
  6. 在google上的东西
  7. JAVA代理模式与动态代理模式
  8. 强制关闭无法关闭的进程的方法
  9. RSA解密-提供enc和pem文件类
  10. 嵌入式Linux工程师发展前景 嵌入式工程师待遇怎样?