在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的方式,捕捉到该异常之后,通知用户检查用户名和密码

原文地址:https://www.cnblogs.com/chenxizhang/p/1455187.html