Onvif 用户验证实现方式
更新时间:2024-01-22 08:04:01 阅读量: 教育文库 文档下载
- onvif协议推荐度:
- 相关推荐
基于gsaop实现onvif之二 .用户验证
1原理
在ONVIF_WG-APG-Application_Programmer's_Guide.pdf文档中第6章描述了
onvif加密方式。Soap通信的验证机制是WS_UsernameToken,流加密的方式是HTTPS。
我们知道onvif的用户验证是基于WS_UsernameToken,而且密码是Digest而
不是明文,先来看一段带有用户验证信息的消息:
所谓的WS_UsernameToken加密,就是将 用户名,密码,Nonce,Created都
包含在了header里面。如果将#passwordDigest换成#passwordText的话,密码就是明文的,当然onvif说了,密码是Digest。
我们知道了用户名密码,那如何验证呢?文档里面提到了获取Digest的公式:
Digest = B64ENCODE( SHA1( B64DECODE( Nonce ) + Date + Password ) )
2 实现
现在知道了WS_UsernameToken是怎么回事,下面我们来看看如何实现验证
吧。在gsoap文档中推荐使用wsseapi的插件来实现,这肯定最方便的方法,这个很简单,看看wsse的帮助就知道了。我不需要wsse里面的那么多冗余代码。想用最精简的办法来实现,毕竟wsseapi里面包含了非常多的加密方式,而onvif只规定了WS_UsernameToken。所以自己动手。
第一步,先要把用户名,密码Digest,nonce给获取到。我们知道这些都再
Header中。soap_in_SOAP_ENV__Header 这个函数是用来反序列化(xml转成数据结构)header中信息的。所以就在这里面干。
我们依葫芦画瓢的写了个soap_in_PointerTo_Authentication函数调用,这个函数是用来从header中将我们需要的信息提取出来的。
int soap_in_PointerTo_Authentication(struct soap *soap ,SOAP_ENV__Header *a) { size_t soap_flag_Username = 1; size_t soap_flag_Password = 1; size_t soap_flag_Nonce = 1; size_t soap_flag_wsu__Created = 1; char * username = NULL; char * password = NULL; char * onece = NULL;
char * created = NULL; char * password_local =NULL;
if (soap_element_begin_in(soap, \ { TraceErr(\ a->user_group= USER_LEAVEL_GUEST; return 1; } if(soap_element_begin_in(soap, \ { TraceErr(\ a->user_group= USER_LEAVEL_GUEST; return 1; } for (;;) { soap->error = SOAP_TAG_MISMATCH; //printf(\%d:%d:%d:%d\\n\d); if (soap_flag_Username && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, \ { soap_flag_Username--; TraceImport(\ continue; } if (soap_flag_Password && soap->error == SOAP_TAG_MISMATCH) if (soap_in_string(soap, \ { soap_flag_Password--; TraceImport(\ continue; } if (soap_flag_Nonce && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, \ { soap_flag_Nonce--; TraceImport(\ continue; } if (soap_flag_wsu__Created && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, \ { soap_flag_wsu__Created--; TraceImport(\ continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return USER_LEAVEL_GUEST;; } soap_element_end_in(soap, \ soap_element_end_in(soap, \ /*到这里已经完整的获取了用户信息。*/
验证。。
return SOAP_OK;
}
获取到了用户信息,接下来就可以验证了
参考soap_wsse_verify_Password(struct soap *soap, const char *password)函数,你就可以验
证密码了。
其实本来我们可以在soap_in_SOAP_ENV__Header直接返回验证错误的信息给
client,但是ONVIF规定了一些函数不需要验证,比如说getSystemDateAndTime、所以我们只能保存验证是否通过的信息,然后在调用不同方法的时候根据实际情况返回验证失败。
参考信息: http://blog.csdn.net/yui/archive/2010/09/03/5862411.aspx 洪子
Whtc123@sina.com
正在阅读:
Onvif 用户验证实现方式01-22
一年四季作文450字06-16
考前化学用语表达强化训练06-08
福建省2018届高三质量检查测试(4月)理科综合试卷(Word版,含答案) - 图文12-29
人因工程学课后习题及解答04-19
医学生理学期末重点笔记 - - 第8章 - - 尿的生成与排出03-15
2016周立波语录02-10
第二篇信用风险练习题(有答案40道,2017.5.20)06-04
Solidworks软件的二次开发在选煤厂三维设计中的应用2105-01
新型煤化工产业链09-05
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 验证
- 实现
- 方式
- 用户
- Onvif
- 成本法下直接编制合并财务报表的案例分析1
- 黑河学院学籍预警制度暂行办法(1)
- 《老友记》里的美国地道俚语
- 某镇中心卫生院医技综合楼项目可行性研究报告
- 某项目能耗模拟分析报告(绿色建筑三星级标准)
- 年产10万吨啤酒工厂的设计
- 基于H桥级联的电压暂降补偿研究
- 青岛市交通建设工程施工现场安全标准化实施细则
- 雾都孤儿中南希的形象解读
- 北师大版六年级下册单元课内阅读重点训练题库8
- 白音门德小学幼儿园可行性研究报告
- 关于开展第二批党的群众路线教育实践活动的指导意见
- 南昌大学材料科学基础2014年期末复习题
- 2016年证券从业《金融市场基础知识》真题汇编(二)
- 谈如何提高建筑材料的检测与试验结果的准确性
- 西安市市属企事业单位名单
- 教育部“家庭教育指导师”题库 - 图文
- 湘建价计2008号文
- 2009年浙江高考理科数学试题及答案
- 教案 中级财务会计 第五章 长期股权投资 孙美杰主篇配套教案 立信会计出版社出版 - 图文