【转载】在VS2008中使用WSE 3.0过程全记录

【转载】在VS2008中使用WSE 3.0过程全记录

WSE全称是Web Service Enhancement,提供了更好的安全性实现,以及大对象传输的设计。

有关WSE的一些介绍,如果不清楚,可以参考下面的链接

官方介绍:http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/WSESecurity.mspx?mfr=true

下载位置:http://www.microsoft.com/downloads/details.aspx?FamilyID=018a09fd-3a74-43c5-8ec1-8d789091255d&DisplayLang=en

这两天讲课中又提到了WSE。现在我们用的是VS2008,与之前VS2005还有一点不一样。所以,今天我再次将使用步骤做一个完整的记录

第一部分:准备证书

WSE是需要证书的。证书是用来对消息进行加密和签名的。作为测试目的,可以通过makecert这个工具来做

image

我自己写了一个bat文件,内容如下

REM 这个脚本用来创建一个测试的证书

REM 作者:陈希章

set CERTNAME=TestServiceCert
certmgr -del -r LocalMachine -s My -c -n %CERTNAME%
makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=%CERTNAME% -sky exchange -pe
set WP_ACCOUNT=NETWORK SERVICE
(ver | findstr “5.1”) && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET
winhttpcertcfg -g -c LOCAL_MACHINE\My -s %CERTNAME% -a “%WP_ACCOUNT%”

REM 授予IIS帐号对该证书的访问权限
iisreset
pause

红色的部分,你可以修改成自己想要的名称

创建好证书之后

image

第二部分:创建和配置服务

1. 创建服务。

【注意】经过反复测试,必须使用网站模板,而不是项目模板创建Web Service

image

2. 在服务项目中,添加对Microsoft.Web.Service3.dll的引用

image

【备注】该程序集的位置在

image

image

3. 通过Configuration Tool配置服务。在VS2005的时候,这个工具可以集成到IDE中。而VS2008则不可以

image

image

选择”File”==》“Open”

image

在General页面中选中两个选项

image

在Security页面,注意选中Allow Test Root,因为我们用的证书是一个测试的,不受信任的。

image

在Policy页面,启用Policy

image

下面,我们准备创建一个策略。点击”Add”

image

输入一个名称,然后点击”OK”

image

image

这向导的这个页面,选择”Secure a Service Application”, 并且选择客户端验证方法为”UserName”(这种方式其实使用服务器的Windows帐号作为凭据的)

image

这个页面可以做授权(Authorization)。我们这里不做指定

image

这个页面我们保留所有默认值

image

这个页面中点击”Select Certificate” ,

image

选择我们刚才创建的证书:TestServiceCert, 然后点击“确定”

image

点击“Finish”,即可完成所有的配置

完成之后,选择”File” ==》“Save”来保存配置

image

然后,可以关闭Configuration Tool,回到Visual Studio环境中。这个Service很简单,我们也不准备做任何修改。

image

image

点击“显示所有文件”这个按钮,我们会发现多了一个文件:wse3policyCache.config

image

选择该文件,点击右键,选择”包含在项目中”

image

双击打开该文件。这是一个附加的配置文件,我们刚才所做的配置都记录在该文件中。

image

我们还可以双击Web.config,看看有什么变化

image

4. 在服务上面应用策略

完成了策略配置之后,接下来我们就是为服务应用策略了。

转到Service1.asmx.cs文件

image

到这里为止,服务端的配置就完成了。此时,请编译项目。(Ctrl+Shift+B)

接下来我们需要创建客户端进行测试

第三部分:创建客户端并且进行测试

1. 在解决方案中添加一个Windows Forms应用程序

image

image

2. 添加Web Service引用

image

image

点击“此解决方案中的Web 服务”

image

点击“Service1”

image

点击“添加引用”

image

3. 编写代码访问HelloWorld方法

image

4. 运行Client程序,进行调试

将Client项目设置为启动项目
image

然后,按F5键进行调试

image

点击“调用服务”,我们会遇到一个异常,如下

image

image

为什么会出现这样的异常呢?

原因很简单:服务器端已经启用了WSE,而客户端并没有启用。所以,接下来,我们得完成客户端的配置

5. 运行configuration Tool对客户端进行配置。

通过”File” =>”Open”打开Client项目的app.config

image

General页面中只能选中第一个选项。

image

Security页面中照样要选中“Allow test roots”

image

Policy页面中启用Policy后,点击“add”

image

输入名称,点击“Ok”

image

image

这个页面中选择“Secure a client application”,并且设置验证方法为”UserName”

image

保留默认值,在代码中指定用户的凭据

image

保留默认值

image

【注意】这里要选择与服务器相同的证书。点击Next,然后点击Finish

image

最后,完成保存后关闭Configuration Tool

回到Visual Studio之后,将wse3policyCache.config文件包含到项目中

image

并且设置该文件的属性。复制到输出目录

image

6. 在Client项目也添加对Microsoft.Web.Service3.dll的引用

image

7. 修改Web引用的代理文件

image

双击Reference.cs

image

添加一个using语句。并且将Service1这个类的基类修改为WebServiceClientProtocol.保存该文件,重新编译

8. 修改窗体代码

image

9. 再一次进行调试。我们就可以正常看到一个对话框

image

第四部分:查看加密的消息。

我们知道现在的消息是通过证书加密的,但事实上是不是真的加密了呢?我们可以通过Configuration Tool再次打开客户端的配置文件app.config

image

在Diagnostics页面,Enable Message Trace

然后保存该文件。重新调试客户端。此时会生成两个文件。

image

我们可以打开InputTrace.webinfo看一下。在SOAPBody里面的内容已经经过了加密

image

SOAPHeader里面包含了我们的用户名和密码,毫无疑问,也是经过了加密的

第五部分:使用自定义的UserNameTokenManager

上面的例子很成功,但目前它所使用的用户凭据是Windows凭据。如果我们想自定义身份验证,应该怎么办呢?

1. 创建自定义的UserNameTokenManager.

我们可以创建一个单独的类库项目

image

在该项目中,添加对Microsoft.Web.Service3.dll的引用

创建一个类型,代码大致如下

image

编译该项目。

2. 在服务项目中添加上述程序集的引用

image

3. 重新用Configuration Tool对服务的Web.config进行配置。定位到“Security”页面

image

在Security Tokens Managers的位置,点击”Add”

image

在Built in Token Managers中选择“UserNameTokenManager”

image

将Type修改为

MyUserNameTokenManger.MyUserNameTokenManger,MyUserNameTokenManger

image

保存修改之后,在web.config中可以发现下面的变化

<securityTokenManager>
  <add type=”MyUserNameTokenManager.MyUserNameTokenManager,MyUserNameTokenManager” namespace=”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd”localName=”UsernameToken” />

注意,红色的部分一定不要去更改,否则就是无法成功。没有什么理由,但我也为此耗费了几个小时。

</securityTokenManager>

4. 重新调试客户端

客户端的配置和代码无需任何更改

如果正确地提供了密码,则会返回”Hello,world”,否则,会返回下面的错误

image

应该用try…catch的方式,捕捉到该异常之后,通知用户检查用户名和密码

 

【转自】http://www.cnblogs.com/chenxizhang/archive/2009/05/12/1455187.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119413.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Android上图片文字识别

    Android上图片文字识别最近做了一款Android应用需要输入大量的数据,为了提高体验我想了很多种输入数据的方式,最终采用了两种:二维码扫描和图片识别。前者顾名思义有个短板,就是需要生成二维码,下面就介绍下图片文字识别实现。本应用是基于是OCR引擎,故需要第三方的jar包tess-two.tesseract3.01-leptonica1.68-LibJPEG6b.jar下载链接:点击打开链接另外tessdat…

  • tensorflow tensor转numpy

    tensorflow tensor转numpysess=tf.Session()withsess.as_default():change=tf.expand_dims(tf.reshape(batch_rodrigues((np.array(gt_data[‘pose_0’]).flatten()).reshape(-1,3).astype(np.float32)),(24,3,3)),0)gt_data[‘po.

    2022年10月19日
  • 解决WinHTTP Web Proxy Auto-Discovery Service无法启动问题

    解决WinHTTP Web Proxy Auto-Discovery Service无法启动问题需要启动该服务的起因是需要抓包,所以下载了charles,但无任何抓包信息,也没有错误提示,未查到原因。遂又下载了fiddler,此时启动会提示“FailedtoregisterFiddlersasthesystemproxy”,上网查原因是WinHTTPWebProxyAuto-DiscoveryService该服务没有启动,到服务中查询确实如此。解决方案(此为对我生效的解决方案,关联服务未启动等其他问题导致也是有可能的):win+Rregedit打开注册表,找到\HK

  • 写给那些没有用过oracle存储过程但又准备学习的同志们

    写给那些没有用过oracle存储过程但又准备学习的同志们公司属于外包公司,公司所用的是oracle数据库,所以,避免不了操作oracle数据库,而且动不动就是调用存储过程,但是发现一个问题,对于存储过程的学习还是有相对有限的系统性的学习资料。都是一些零碎的学习资料,东一榔头西一棒槌。所以本人在这里就给大家操作一波存储过程,从基础语法到java程序调用存储过程。这几篇文章只是学习的起步,但又是学习存储过程至关重要的一个环节,相信你看完这篇文章可以说是对存…

  • 从伯努利分布到多项式分布的条件_伯努利分布的期望

    从伯努利分布到多项式分布的条件_伯努利分布的期望1.伯努利分布(bernoulidistribution)又称0-1分布,指一次随机试验,结果只有两种。也就是一个随机变量的取值只有0和1。其中p表示一次伯努利实验中结果为正或为1的概率。概率计算:

    2022年10月12日
  • js中对象转数组_js如何转数组

    js中对象转数组_js如何转数组今天睡前看到小组群里贴了这么一张图,印象中曾经面试的时候好像也是遇到过,对于大佬们来说这肯定是很基础的一道题,在此分享给正在学习前端和正在面试的小伙伴们。这里我用fo……in……实现了两种取值方式的改变letobj={json:0,production:1,html:2}vararr=[];for(letiinobj){leto={};o[i…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号