65.9K
CodeProject 正在变化。 阅读更多。
Home

WCF 服务方法级别安全性( 使用消息契约)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (19投票s)

2012 年 1 月 23 日

CPOL

5分钟阅读

viewsIcon

118169

downloadIcon

4030

本文介绍了如何在自定义身份验证、机密性和完整性的背景下,使用消息契约实现服务方法的安全性。

引言

本文介绍了如何在自定义身份验证、机密性和完整性的背景下,使用消息契约实现服务方法的安全性。消息在客户端以MessageHeader的形式打包了身份验证信息。服务会拦截此消息并验证消费客户端的可信度。此外,我们还将通过消息契约检查如何对消息中的部分头部信息和全部主体信息进行签名或加密。

现实生活场景

可能存在一个服务方法正在通过网络传输敏感信息,而您希望对该特定服务方法采取一些独有的安全措施。您可以为服务方法将安全令牌打包到相关的消息头部,并在服务端验证该令牌后再返回响应。此外,由于消息中的信息高度敏感,您可以对消息进行签名和加密。在本文中,我们将使用消息契约,为特定服务方法实现此类服务方法级别的身份验证和消息级别的安全性。

实现WCF服务

为了实现上述概念,我们将开发一个简单的WCF服务项目。该WCF服务有一个GetAccountsData方法,该方法在验证输入的CustomerCredential后返回客户的AccountsInfo

服务方法传递和返回的类型被定义为消息契约。为了对消息部分进行签名/加密,我们将使用保护级别。任何消息部分的保护都存在三个基本级别:

  • 无。
  • 签名。受保护的部分被数字签名。这确保了对受保护消息部分的任何篡改都能被检测到。
  • 加密和签名。消息部分在签名之前会被加密以确保机密性。

要设置保护级别,请使用System.Net.Security命名空间。

CustomerCredential消息契约包含一个MessageHeader元素SecurityToken,该元素在服务端进行验证。

需要注意的一点是,SOAP主体只有一个保护级别,即使您有多个具有不同保护级别的消息体部分。在AccountsInfo消息契约的情况下,将采用所有消息体部分中最高的保护级别(在本例中为EncryptAndSign)。SOAP头部可以具有不同的保护级别。我特意在Message主体中设置了不同的保护级别,以验证此行为。我们将在检查HTTP流量时对此进行验证。

实现服务方法。如果SecurityToken匹配,则该方法返回客户的AccountsInfo,否则抛出安全异常。

默认的WCF绑定BasicHttpBinding不支持保护级别。我们需要为我们的服务引入wsHttp绑定。要引入wsHttp绑定,请在web.config文件中进行如下条目配置:

<services>
      <service name="MyWCFService.MyService">
        <endpoint address="" binding="wsHttpBinding" contract="MyWCFService.IMyService"/>
        </service>
</services>

右键点击MyService.svc文件 -> 在浏览器中查看,以检查WCF服务生成的WSDL。

将服务发布到Internet信息服务器(IIS)

我们可以不将服务发布到IIS而调用它。但最后,我们还要检查消息的签名/加密。当某个客户端应用程序消费该服务时,我们将使用Fiddler工具检查HTTP流量。为此,我们需要将其发布到IIS(有时Fiddler在检查localhost流量时会出现问题。对此有一些变通方法,但最好还是将服务发布到IIS)。右键点击WCF服务应用程序项目,然后点击发布。在IIS中创建一个名为WCFVW的虚拟目录并发布服务。修改目标位置为您PC的名称。

在浏览器中浏览新发布的该服务

点击服务链接并检查WSDL。

调用服务

我们将创建一个简单的控制台应用程序来消费该服务。添加一个控制台应用程序项目。右键点击“引用”->“添加服务引用”。在地址框中输入WCF服务URL。

点击“确定”后,将生成桩代码。打开Program.cs并添加以下命名空间:

实现以下代码以使用通道工厂调用服务。SecurityToken被设置在MessageHeader中。如果凭据匹配,将打印检索到的Customer的账户详细信息,否则将在控制台中显示服务抛出的错误。

运行控制台应用程序。由于SecurityToken在服务端匹配,因此将检索到账户信息。

现在修改客户端代码以传递不同的SecurityToken

运行控制台应用程序。由于SecurityToken不匹配,服务将抛出错误。

检查消息签名/加密

我们已经完成了项目,现在是时候嗅探服务和客户端之间的HTTP流量,以验证我们消息契约中期望的签名/加密。运行HTTP数据检查器Fiddler。然后,运行控制台应用程序以调用服务。检查服务请求流量。

请求流量包括CustomerCredential消息契约中的消息部分SecurityToken(作为MessageHeader)和CustomerID(作为MessageBodyMember)。由于我们将MessageHeader的保护级别设置为“EncryptAndSign”,因此SecurityToken已被签名和加密。此外,MessageBodyMember CustomerID可见,因为其保护级别设置为“None”。

现在检查响应消息。返回的AccountsInfo消息契约没有MessageHeader。它有MessageBodyMembers,具有不同的保护级别。如我之前提到的,即使您有多个具有不同保护级别的消息体部分,SOAP主体也只有一个保护级别。在这种情况下,将采用所有消息体部分中最高的保护级别EncryptAndSign,整个messagebody将变为已签名和加密。

历史

  • 2012年1月21日:初始版本
© . All rights reserved.