匿名客户端的消息安全
下面的方案演示通过 Windows Communication Foundation (WCF) 消息安全进行保护的客户端和服务。其设计目的是使用消息安全而非传输安全,以便将来可支持更加丰富的基于声明的模型。有关 将丰富声明用于授权的更多信息,请参见
特征 | 说明 |
---|---|
安全模式 | 消息 |
互操作性 | 仅 WCF |
身份验证(服务器)
| 初始协商要求服务器身份验证,而不是客户端身份验证 |
身份验证(客户端) | 无 |
完整性 | 是,使用共享安全上下文 |
保密性 | 是,使用共享安全上下文 |
传输 | HTTP |
下面的代码和配置应独立运行。执行下列操作之一:
下面的代码演示如何创建使用消息安全的服务终结点。
以下配置可代替代码使用。服务行为元素用于指定用来向客户端验证服务身份的证书。服务元素必须使用 behaviorConfiguration 属性指定行为。绑定元素指定客户端凭据类型为 None,这将允许匿名客户端使用该服务。
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="ServiceCredentialsBehavior"> <serviceCredentials> <serviceCertificate findValue="contoso.com" storeLocation="LocalMachine" storeName="My" /> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="ServiceCredentialsBehavior" name="ServiceModel.Calculator"> <endpoint address="http://localhost/Calculator" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator" name="CalculatorService" contract="ServiceModel.ICalculator" /> </service> </services> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_ICalculator" > <security mode="Message"> <message clientCredentialType="None" /> </security> </binding> </wsHttpBinding> </bindings> <client /> </system.serviceModel></configuration>
下面的代码和配置应独立运行。请执行下列操作之一:
下面的代码创建客户端的一个实例。绑定使用消息模式安全,客户端凭据类型设置为 None。
下面的代码将配置客户端。
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_ICalculator" > <security mode="Message"> <message clientCredentialType="None" /> </security> </binding> </wsHttpBinding> </bindings> <client> <endpoint address="http://machineName/Calculator" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator" contract="ICalculator" name="WSHttpBinding_ICalculator"> <identity> <dns value="contoso.com" /> </identity> </endpoint> </client> </system.serviceModel></configuration>
posted @ 2009-12-11 13:37 kim zeng 阅读(37) | 评论(0) | 编辑
利用证书身份验证的传输安全
下面的方案演示由 X.509 证书保护的 Windows Communication Foundation (WCF) 客户端和服务。每个客户端都有一个可用于客户端安全套接字层 (SSL) 身份验证,并受到服务信任的证书。此示例演示一种请求/回复消息模式。
有关 将证书用于服务的更多信息,请参见使用证书和如何:使用 SSL 证书配置端口。
特征 | 说明 |
---|---|
安全模式 | 传输 |
互操作性 | 与现有 Web 服务客户端和服务。 |
身份验证(服务器) 身份验证(客户端) | 是(使用 HTTPS) 是(使用证书) |
完整性 | 是 |
保密性 | 是 |
Transport | HTTPS |
绑定 |
下面的代码和配置应单独运行。请执行下列操作之一:
下面的代码演示如何创建使用传输安全和证书的服务终结点。
下面的配置可代替代码用于设置服务:
<bindings> <wsHttpBinding> <binding name="CertificateWithTransport"> <security mode="Transport"> <transport clientCredentialType="Certificate"/> </security> </binding> </wsHttpBinding></bindings><services> <service name="ServiceModel.Calculator" behaviorConfiguration="credentialConfig" > <endpoint address="" binding="wsHttpBinding" bindingConfiguration="CertificateWithTransport" contract="ServiceModel.ICalculator" /> </service></services><behaviors> <serviceBehaviors> <behavior name="credentialConfig"> <serviceCredentials> <clientCertificate trustedStoreLocation="LocalMachine" revocationMode="Online"/> </serviceCredentials> </behavior> </serviceBehaviors></behaviors>
下面的代码和配置应独立运行。请执行下列操作之一:
下面的代码创建客户端。绑定配置为使用传输模式安全(采用 TCP 传输协议),并且客户端凭据类型设置为 Windows。
下面的配置代码是针对该客户端,并且同样指定了证书位置以及用于查找它的值。
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="credentialConfiguration"> <clientCredentials> <clientCertificate findValue="Contoso.com" storeLocation="CurrentUser" x509FindType="FindBySubjectName" /> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_ICalculator"> <security mode="Transport"> <transport clientCredentialType="Certificate" /> </security> </binding> </wsHttpBinding> </bindings> <client> <endpoint address="https://machineName/Calculator" behaviorConfiguration="credentialConfiguration" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator" contract="ICalculator" name="WSHttpBinding_ICalculator" /> </client> </system.serviceModel></configuration>
posted @ 2009-12-11 13:23 kim zeng 阅读(81) | 评论(0) | 编辑
通过基本身份验证确保的传输安全
下图演示一个 Windows Communication Foundation (WCF) 服务和客户端。服务器需要一个有效的可用于安全套接字层 (SSL) 的 X.509 证书,并且客户端必须信任此服务器证书。此外,Web 服务已经有一个可以使用的 SSL 实现。有关 启用 Internet 信息服务 (IIS) 中的基本身份验证的更多信息,请参见 http://go.microsoft.com/fwlink/?LinkId=83822(可能为英文网页)。
特征 | 说明 |
---|---|
安全模式 | 传输 |
互操作性 | 与现有的 Web 服务客户端和服务进行互操作 |
身份验证(服务器) 身份验证(客户端) | 是(使用 HTTPS) 是(通过用户名/密码) |
完整性 | 是 |
保密性 | 是 |
Transport | HTTPS |
绑定 |
下面的代码和配置将独立运行。执行下列操作之一:
下面的代码演示如何创建使用 Windows 域用户名和密码确保传输安全的服务终结点。请注意,此服务要求使用 X.509 证书向客户端进行身份验证。有关更多信息,请参见使用证书和如何:使用 SSL 证书配置端口。
下面将配置一个服务以使用具有传输级安全的基本身份验证:
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="UsernameWithTransport"> <security mode="Transport"> <transport clientCredentialType="Basic" /> </security> </binding> </wsHttpBinding> </bindings> <services> <service name="BasicAuthentication.Calculator"> <endpoint address="https://localhost/Calculator" binding="wsHttpBinding" bindingConfiguration="UsernameWithTransport" name="BasicEndpoint" contract="BasicAuthentication.ICalculator" /> </service> </services> </system.serviceModel></configuration>
下面的代码演示包括用户名和密码在内的客户端代码。请注意,此用户必须提供一个有效的 Windows 用户名和密码。此处不显示用于返回用户名和密码的代码。使用对话框或其他界面来查询用户的相关信息。
注意:
用户名和密码只能使用代码进行设置。
下面的代码演示客户端配置。
注意:
不能使用配置来设置用户名和密码。此处显示的配置必须使用代码进行扩充以设置用户名和密码。
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_ICalculator" > <security mode="Transport"> <transport clientCredentialType="Basic" /> </security> </binding> </wsHttpBinding> </bindings> <client> <endpoint address="https://machineName/Calculator" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator" contract="ICalculator" name="WSHttpBinding_ICalculator" /> </client> </system.serviceModel></configuration>
posted @ 2009-12-11 11:57 kim zeng 阅读(45) | 评论(0) | 编辑
匿名客户端的传输安全
此 Windows Communication Foundation (WCF) 方案使用传输安全 (HTTPS) 确保保密性和完整性。必须使用安全套接字层 (SSL) 证书对服务器进行身份验证,并且客户端必须信任服务器的证书。客户端不通过任何机制进行身份验证,因此是匿名的。
有关示例应用程序,请参见 WS Transport Security。有关 传输安全的更多信息,请参见传输安全概述。
有关 将证书用于服务的更多信息,请参见使用证书和如何:使用 SSL 证书配置端口。
特征 | 说明 |
---|---|
安全模式 | 传输 |
互操作性 | 与现有 Web 服务和客户端 |
身份验证(服务器) 身份验证(客户端) | 是 应用程序级(无 WCF 支持) |
完整性 | 是 |
保密性 | 是 |
Transport | HTTPS |
绑定 |
下面的代码和配置将独立运行。执行下列操作之一:
下面的代码演示如何使用传输安全创建终结点:
下面的代码使用配置设置相同的终结点。客户端不通过任何机制进行身份验证,因此是匿名的。
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <services> <service name="ServiceModel.Calculator"> <endpoint address="http://localhost/Calculator" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator" name="SecuredByTransportEndpoint" contract="ServiceModel.ICalculator" /> </service> </services> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_ICalculator"> <security mode="Transport"> <transport clientCredentialType="None" /> </security> </binding> </wsHttpBinding> </bindings> <client /> </system.serviceModel></configuration>
下面的代码和配置将独立运行。请执行下列操作之一:
下面的配置可代替代码用于设置服务。
<configuration> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_ICalculator" > <security mode="Transport"> <transport clientCredentialType="None" /> </security> </binding> </wsHttpBinding> </bindings> <client> <endpoint address="https://machineName/Calculator" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator" contract="ICalculator" name="WSHttpBinding_ICalculator" /> </client> </system.serviceModel></configuration>
posted @ 2009-12-11 11:55 kim zeng 阅读(39) | 评论(0) | 编辑
不安全的 Intranet 客户端和服务
下面的插图描述了一种简单的 Windows Communication Foundation (WCF) 服务,开发此服务的目的是为了向 WCF 应用程序提供有关安全专用网络的信息。在以下情况下无需提供安全性:数据重要性较低、网络在本质上是安全的,或者由 WCF 基础结构的下层提供安全性。
特征 | 说明 |
---|---|
安全模式 | 无 |
传输 | TCP |
绑定 | |
互操作性 | 仅 WCF |
身份验证 | None |
完整性 | None |
保密性 | None |
下面的代码和配置将独立运行。执行下列操作之一:
下面的代码演示如何创建不安全的终结点:
下面的代码使用配置设置相同的终结点:
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <behaviors /> <services> <service behaviorConfiguration="" name="ServiceModel.Calculator"> <endpoint address="net.tcp://localhost:8008/Calculator" binding="netTcpBinding" bindingConfiguration="tcp_Unsecured" name="netTcp_ICalculator" contract="ServiceModel.ICalculator" /> </service> </services> <bindings> <netTcpBinding> <binding name="tcp_Unsecured"> <security mode="None" /> </binding> </netTcpBinding> </bindings> <client /> </system.serviceModel></configuration>
下面的代码和配置应独立运行。请执行下列操作之一:
以下代码演示一个使用 TCP 协议访问不安全终结点的基本 WCF 客户端。
下面的配置代码应用于客户端:
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <bindings> <netTcpBinding> <binding name="NetTcpBinding_ICalculator" > <security mode="None"> </security> </binding> </netTcpBinding> </bindings> <client> <endpoint address="net.tcp://machineName:8008/Calculator " binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ICalculator" contract="ICalculator" name="NetTcpBinding_ICalculator" /> </client> </system.serviceModel></configuration>
posted @ 2009-12-11 11:45 kim zeng 阅读(49) | 评论(0) | 编辑
不安全的 Internet 客户端和服务
下面的插图演示了一个公共的、不安全的 Windows Communication Foundation (WCF) 客户端和服务的示例。
特征 | 说明 |
---|---|
安全模式 | 无 |
传输 | HTTP |
绑定 | 在代码中使用 BasicHttpBinding,或在配置中使用 <basicHttpBinding> 元素。 |
互操作性 | 与现有的 Web 服务客户端和服务进行互操作 |
身份验证 | None |
完整性 | None |
保密性 | None |
下面的代码和配置将独立运行。执行下列操作之一:
下面的代码演示如何创建不安全的终结点。默认情况下,BasicHttpBinding 将安全模式设置为 None。
下面的代码使用配置设置相同的终结点。
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <behaviors /> <services> <service behaviorConfiguration="" name="ServiceModel.Calculator"> <endpoint address="http://localhost/Calculator" binding="basicHttpBinding" bindingConfiguration="Basic_Unsecured" name="BasicHttp_ICalculator" contract="ServiceModel.ICalculator" /> </service> </services> <bindings> <basicHttpBinding> <binding name="Basic_Unsecured" /> </basicHttpBinding> </bindings> <client /> </system.serviceModel></configuration>
下面的代码和配置将独立运行。执行下列操作之一:
下面的代码演示一个访问不安全终结点的基本 WCF 客户端。
下面的代码将配置客户端。
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_ICalculator" > <security mode="None"> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost/Calculator/Unsecured" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICalculator" contract="ICalculator" name="BasicHttpBinding_ICalculator" /> </client> </system.serviceModel></configuration>
posted @ 2009-12-11 11:43 kim zeng 阅读(44) | 评论(0) | 编辑
Windows Communication Foundation (WCF) 安全分为三个主要功能区域:传输安全、访问控制和审核。传输安全提供完整性、保密性和身份验证。传输安全由传送安全、消息安全或TransportWithMessageCredential 实现。
有关 WCF 消息安全的概述,请参见安全性概述。有关 其他两种 WCF 安全的更多信息,请参见授权和审核安全事件。
使用 WCF 传输安全的常见方案包括:
三项功能 — 完整性、保密性和身份验证 — 合称为传输安全。传输安全提供的这些功能,有助于减轻对分布式应用程序的威胁。下表简要介绍构成传输安全的三项功能。
功能
说明
完整性
完整性可以确保数据是完整、准确的,在数据从一点移动到另一点,并可能由多个操作者读取的情况下,尤其如此。完整性必须得到维护,以免数据被篡改,这通常是由消息的数字签名实现的。
保密性
保密性可以确保消息不被目标读取者以外的任何人读取。例如,信用卡号在通过 Internet 发送时必须保密。保密性通常是用公钥/私钥方案进行数据加密实现的。
身份验证
身份验证是对已声明标识进行的验证。例如,当使用银行帐户时,必须只允许帐户的实际所有者取款。有多种方式可以实现身份验证。一个常用方法是使用用户/密码系统。第二个方法是使用第三方提供的 X.509 证书。
WCF 有多种传输安全模式,如下表所述。
模式
说明
None
传输层和消息层都不提供安全措施。默认情况下,预定义绑定都不使用此模式,只有 <basicHttpBinding> 元素(使用代码时,则为 BasicHttpBinding 类)例外。
Transport
使用安全传送(如 HTTPS)实现完整性、保密性和相互身份验证。
Message
使用 SOAP 消息安全实现完整性、保密性和相互身份验证。SOAP 消息是按照 WS-Security 标准获得保护的。
混合模式
使用传送安全实现完整性、保密性和服务器身份验证。使用消息安全(WS-Security 和其他标准)实现客户端身份验证。
(此模式的枚举值是 TransportWithMessageCredential。)
消息和传送
在传送级别和消息级别都执行保护和身份验证。此模式仅在 <netMsmqBinding> 元素中可用。
凭据是一些数据,用于证实已声明标识或功能。出示凭据包括出示数据以及数据的所有权证明。WCF 在传输和消息安全级别支持多种凭据类型。您可以为 WCF 绑定指定凭据类型。
在许多国家和地区,驾驶执照就是凭据的一个示例。该执照中包含表示个人身份和能力的数据。它以持有人照片的形式包含所有权证明。该执照由受信任的颁发机构颁发,通常是获得许可的政府部门。该执照采用密封形式且包含一张全息图,表明它未经改动或伪造。
例如,考虑 WCF 中支持的两种凭据类型:用户名和 (X.509) 证书凭据。
对于用户名凭据,用户名表示已声明标识,密码表示所有权证明。这种情况下,受信任的颁发机构则是验证用户名和密码的系统。
在证书凭据中,主题名称、主题备用名称或证书中的特定字段可用于表示已声明标识和/或功能。凭据中的数据所有权证明的建立,是用关联私钥生成签名实现的。
有关 传输安全编程和指定凭据的更多信息,请参见绑定与安全和 WCF 中的安全行为。
下表列出了在创建使用传输安全的应用程序时可能使用的值。在代码或绑定设置中,可以使用这些值。
设置
说明
None
指定客户端不需要提供任何凭据。这相当于匿名客户端。
Basic
指定基本身份验证。有关其他信息,请参见 RFC2617“HTTP 身份验证:基本和摘要式身份验证(可能为英文网页)。”
Digest
指定摘要式身份验证。有关其他信息,请参见 RFC2617“HTTP 身份验证:基本和摘要式身份验证(可能为英文网页)。”
Ntlm
指定在 Windows 域中使用 SSPI 协商进行 Windows 身份验证。
要使用 SSPI 协商,就需要使用 Kerberos 协议或 NT LanMan (NTLM)。
Windows
指定在 Windows 域中使用 SSPI 进行 Windows 身份验证。SSPI 选择 Kerberos 协议或 NTLM 作为身份验证服务。
SSPI 首先尝试 Kerberos 协议;如果失败,则使用 NTLM。
Certificate
使用证书(通常是 X.509)执行客户端身份验证。
下表列出了在创建使用消息安全的应用程序时可能使用的值。在代码或绑定设置中,可以使用这些值。
设置
说明
None
允许服务与匿名客户端交互。
Windows
允许在 Windows 凭据的已通过身份验证的上下文中执行 SOAP 消息交换。使用 SSPI 协商机制选择 Kerberos 协议或 NTLM 作为身份验证服务。
Username
允许服务可以要求使用用户名凭据对客户端进行身份验证。请注意,WCF 不允许对用户名进行任何加密操作,例如生成签名或加密数据。因此,WCF 强制要求在使用用户名凭据时确保传输的安全性。
证书
允许服务要求使用证书对客户端进行身份验证。
CardSpace
允许服务要求使用 CardSpace 对客户端进行身份验证。
对于每个客户端凭据类型,WCF 编程模型都允许通过服务行为和通道行为来指定凭据值和凭据验证程序。
WCF 安全有两种凭据类型:服务凭据行为和通道凭据行为。WCF 中的凭据行为指定实际数据,即用于满足安全要求(通过绑定表示)的凭据。在 WCF 中,客户端类是运行时组件,它在操作调用和消息之间进行转换。所有客户端都是从 ClientBase 类继承的。通过基类的 ClientCredentials 属性,可以指定不同的客户端凭据值。
在 WCF 中,服务行为是一些属性,它们在实现服务协定(接口)的类中应用,以编程方式对服务进行控制。使用 ServiceCredentials 类,可以为服务凭据指定证书,也可以为不同的客户端凭据类型指定客户端验证设置。
在消息安全模式中,通过执行传输安全,可以在客户端带外配置服务凭据。例如,如果使用的是存储在 Windows 证书存储区中的证书,则必须使用一个工具,如 Microsoft 管理控制台 (MMC) 单元。
在消息安全模式中,通过执行传输安全,还可以与客户端交换服务凭据,作为初始协商的一部分。若要启用协商,请将 NegotiateServiceCredential 属性设置为 true。
posted @ 2009-12-11 11:27 kim zeng 阅读(136) | 评论(0) | 编辑
Windows Communication Foundation (WCF) 是一个基于 SOAP 消息的分布式编程平台,因此保护客户端和服务之间的消息安全对于保护数据非常重要。WCF 基于现有安全性基础结构和 SOAP 消息的经验证的安全标准提供可互操作的安全消息交换通用平台。
当您使用现有技术(如 HTTPS)、Windows 集成安全性或对用户进行身份验证的用户名和密码生成安全的分布式应用程序时,WCF 将使用熟悉的概念。WCF 不仅与现有安全性基础结构集成,而且还通过使用安全 SOAP 消息将分布式安全性扩展到仅 Windows 域的范围之外。可以将 WCF 视为现有安全机制的一个实现,该安全机制具有将 SOAP 用作现有协议的补充协议的主要优点。例如,用于标识客户端或服务的凭据(如用户名和密码或 X.509 证书)具有可互操作的基于 XML 的 SOAP 配置文件。使用这些配置文件时,消息利用开放式规范(如 XML 数字签名和 XML 加密)进行安全交换。有关规范的列表,请参见系统提供的互操作性绑定支持的 Web 服务协议。
另一个并列项是 Windows 平台上的组件对象模型 (COM),它可实现安全的分布式应用程序。COM 具有全面的安全机制,因此安全上下文可以在各组件间流动;此机制可强制实现完整性、保密性和身份验证。但是,COM 无法像 WCF 一样实现跨平台的安全消息传递。通过使用 WCF,您可以在 Internet 范围内跨多个 Windows 域生成服务和客户端。WCF 的可互操作消息对于生成动态业务驱动型服务至关重要,这有助于确保信息的安全性。
WCF 是一个基于 SOAP 消息的分布式编程平台。通过使用 WCF,您可以创建可用作服务和服务客户端的应用程序,从无限数量的其他服务和客户端创建和处理消息。在此类分布式应用程序中,消息可以从一个节点流向另一个节点,并在通过防火墙进入 Internet 后再通过无数个 SOAP 中间项。这会带来各种不同的消息安全性威胁。下面的示例演示在实体间交换消息时可由 WCF 安全性帮助缓解的部分常见威胁:
总的来说,传输安全性可提供下列保障:
通常,Web 服务部署都具有现成的安全性解决方案,例如,安全套接字层 (SSL) 或 Kerberos 协议。某些服务则利用已部署的安全性基础结构,例如,使用 Active Directory 的 Windows 域。当评估和采用新服务时,通常需要与这些现有技术集成。
WCF 安全性与现有传输安全模型集成,并且可对基于 SOAP 消息安全的新传输安全模型使用现有基础结构。
任何通信安全模型的一个重要组成部分就是能够识别正在通信的实体并对其进行身份验证。这些通信中的实体使用“数字标识”或凭据向通信对等方验证自己的身份。随着分布式通信平台的发展,已实现多种不同的凭据身份验证和相关的安全模型。例如,在 Internet 中,通常使用用户名和密码标识用户。在 Intranet 中,使用 Kerberos 域控制器备份用户和服务身份验证变得越来越普遍。在某些特定情况下,例如两个业务合作伙伴之间,证书可用于对合作伙伴的身份进行相互验证。
因此,在 Web 服务领域中,同样的服务可向内部企业客户公开,也可向外部合作伙伴或 Internet 客户公开,重要的是基础结构可提供与这些现有安全身份验证模型的集成。WCF 安全性支持多种凭据类型(身份验证模型),其中包括: