分享
 
 
 

应用WSDK - 实践Web Services的数字签名(上)

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

应用WSDK - 实践Web Services的数字签名

小气的神

2002-12-05

Article Type: In-Depth

难度等级:8.2/9

版本:1.36

老实说有关Security(安全)的话题,从来不是我的强项,如果可以我宁愿多说一些有关企业级应用开发、有关组件、COM+的话题。不过Web Services是我喜欢的、Internet是我喜欢的,所以有关Web Services的安全话题是不能逃避的,无论我对这方面多么的贫乏,尝试还是愿意的。世界上的许多事情就是这么奇妙的:我的老哥一心向往天空,不想毕业后却去了海运局工作了很久;我的好友立志30岁才结婚,没想到居然网恋成功,娶得一个貌美贤惠的网友,加上结婚生子现在也还是30未到;而我一直很喜欢广州这座城市的氛围,没想到会迷上广州的饮食,有好吃的城市才是美丽的城市:)

Microsoft XML Web Services 的第一个版本,也就是我们现在用的最多的版本,没有提供对SOAP消息进行安全方面处理的支持,也可以说那时WS-Security 还没完成。WSDK则增加了WS-Security的支持和处理。

最简单的说WS-Security主要提供了三个方面的机制来保护我们年轻的Web Services:

1. Security token propagation (解决Security Credentials可以被在网络间进行传播)

2. Message integrity (对消息是否在中间点是否被修改进行验证[Verify])

3. Message Confidentiality ( 保证消息在未解密前依然是机密有效的)

生活最通俗的解释是通过戏剧来表现,比如《哈姆雷特》。哈姆雷特,这个在城堡中游荡的著名黑客,与丹麦国王克劳底斯对决,扬言要杀害许多城堡中居民,克劳底斯则决定干掉哈姆雷特而一劳永逸;于是他派了亲信罗森克劳茨和古登斯坦送哈姆雷特去英格兰。他俩携带一封密信,信上要求一到英格兰就立即将哈姆雷特处死,和哈姆雷特一起的旅途是漫长和极具挑战性的,但是国王、罗森克劳茨和古登斯坦都忘了采取措施来保证:

1. 哈姆雷特不能阅读这封信

2. 哈姆雷特到达英格兰前不能修改这封信

最后这个著名的丹麦黑客,在另外两人熟睡的时候,偷看了信的内容,轻易地将要处死的人改为熟睡的两个国王亲信,并且在信封上盖上他父亲前丹麦国王的印章。作为国王的两个亲信从未想过要看这份信的内容,而且也从未想到自己一到英格兰就被处死。

那么我们看到有关安全最基本的三个问题:

1. 丹麦国王克劳底斯要有办法将信安全的送到英格兰国王的手上。

2. 英格兰国王如何验证信的内容是否为原始信件。

3. 在英格兰国王没有打开信件之前,信中的内容依然是高度机密的。

而当这些问题发生在Internet和Web Services就更有趣了,WS-Security就是完成这个功能的。(如果你哈姆雷特的故事感兴趣,除了看这篇文档最早我是在Java安全性编程指南[Professional Java security]上看到的) 这篇文章也同样是Web Services有关安全的开始,下面我们要做的就是上面将的第一个问题,解决Security Credentials在网络间进行传递的问题。

我将利用WSDK来实践一个Web Services的客户端使用UsernameToken数字签名一个SOAP 消息,同时Web Services又是如何处理这个被UsernameToken签名的消息。我尽量简化了有关加密的处理和流程,试图说明整个的过程,从后面附带的源代码中你可以看到这一点。

整个过程我们会生产一个Web Services和一个Web Services的客户端,同时最多的还是进行一些配置。运行通过的环境Windows XP SP2 / VS.NET 1.0 / WSDK 5217+

生成服务器端部分:

1. 建立一个Web Services 项目 SignSOAPusingName。

2. 加入 Microsoft.Web.Services.DLL 引用。

3. 点击SignSOAPUsingName.asmx.cs 加入下面的代码:

using System.Web.Services.Protocols ;

using Microsoft.Web.Services.Security ;

using Microsoft.Web.Services;

using System.Security.Cryptography ;

4. 去到HelloWorld 的注释代码并加入下面的代码:

[WebMethod]

public string HelloWorld()

{

SoapContext requestContext = HttpSoapContext.RequestContext ;

string retval = "User unknown" ;

if ( requestContext == null )

throw new ApplicationException( " Non-SOAP request" ) ;

if ( !IsValid( requestContext ) )

{

throw new SoapException( "The security infomation Supplied was not valid .", new System.Xml.XmlQualifiedName("Bad Tokens", "http://www.dotnetTools.org/SignSOAPUsingName" ) ) ;

}

UsernameToken theToken = GetUsernameToken( requestContext.Security ) ;

if ( theToken != null )

{

return "Hello " + theToken.Username ;

}

return retval ;

}

5. 在web.config中配置WSDK的Microsoft.Web.WebServices

<webServices>

<soapExtensionTypes> <!-- type= 其内容必须保证在一行不能回车 -->

<add type="Microsoft.Web.Services.WebServicesExtension,Microsoft.Web.Services,Version=1.0.0.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35" priority="1" group="0"/>

</soapExtensionTypes>

</webServices>

6. 加一个新的类实现 IPasswordProvider

using System;

using System.Security.Permissions ;

using System.Security.Cryptography ;

using Microsoft.Web.Services.Security ;

namespace SignSOAPUsingName

{

[SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.UnmanagedCode)]

public class PasswordProvider : IPasswordProvider

{

HashAlgorithm hash ;

public PasswordProvider()

{

hash = new SHA1CryptoServiceProvider() ;

}

public string GetPassword( string userName )

{

byte[] encodedUsername = System.Text.Encoding.UTF8.GetBytes( userName ) ;

Array.Reverse(encodedUsername); //这里我简化了处理,先不考虑那些加密函数

return Convert.ToBase64String(encodedUsername);

}

}

}

7. 在web.config中配置PasswordProvider

<microsoft.web.services>

<security> <!-- type=命名空间.类名,程序集名 -->

<passwordProvider type="SignSOAPUsingName.PasswordProvider, SignSOAPUsingName" />

</security>

</microsoft.web.services>

8. 运行和Build应用程序,F5运行看Web Services是否正常运行

特别:

本文原创,CSDN署名首发,所有文字和图片版权所有。未经授权请勿传播、转载或改编。

如果有问题或建议,请发电子邮件给new2001@msn.com

欢迎访问我的WebSite:www.dotNETTools.org

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有