WCF服务和认证

原文地址:http://msdn.microsoft.com/en-us/library/ms733130.aspx

服务身份与认证
.NET Framework4版本

*一个服务的终结点身份(Endpoint identity)是由服务的WSDL(Web Services Description Language)生成的值。这个可以被传播

到任何一个客户端的值,是用来认证服务的。在客户端对服务发起一个通信,服务将自身认证发给客户端之后,客户端对终结点身

份值和服务端认证发回的值进行比较。如果它们匹配,客户端就能够确定它连接的是所期望的服务终结点。这种机制是为了防止“

钓鱼”程序,即防止一个客户端的连接请求被重定向到一个恶心的服务终结点。
*注意:当你使用NTLM来进行认证,服务身份是不被检查的,因为在NTLM下,客户端不能够认证服务。NTLM是用在Windows工作组下

的计算机或在不支持Kerberos认证的早期版本的Windows下。
*当客户端和服务发起一个安全的通道,并向服务传送信息,WCF框架将会认证服务,而且只会在服务身份与客户端使用的终结点的

身份匹配的时候,才能成功发送消息。认证的过程包括如下步骤:1.在设计阶段,客户端通过服务终结点通过WSDL暴露的元数据获

取服务的身份。2.在运行阶段,客户端程序在发送消息给服务之前,检查服务的安全凭据。客户端的身份验证和服务端的认证相类

似。一个安全的服务不会在客户端的身份被验证之前执行任何操作。同样的,客户端不会发送任何信息到服务端,直到服务端凭据

被验证(身份的凭据是之前从WSDL中暴露的服务端身份)。EndpointAddress类的Identity属性代表被客户端调用的服务的身份。服

务在元数据中发布身份。当客户端通过Svcutil.exe解析终结点元数据,生成的配置文件中就包括了服务的身份信息。WCF框架(被

配置成安全访问)会确保服务验证身份。
*注意:元数据包含了服务的身份,所以建议通过安全的方式发布元数据,比如,通过为服务创建一个HTTPS终结点。
*身份类型 一个服务可以提供5种类型的身份。每一种身份类型都对应着配置文件<identity>节点中的元素。根据不同的应用场景

和安全需求,使用不同的类型。下面的表中有每一种身份类型。
*DNS(域名系统),在X.509证书或windows账户使用此元素。它比较服务凭据中和元素节点中的DNS的名字。一个DNS验证允许你是用

DNS或主机名当证书。如果一个证书使用相同的DNS或主机名重新发布,身份验证同样有效。当一个证书重新发布时,它获得一个新

的RSA键,但是仍包含相同的DNS或主机名。这意味着客户端不需要更新他们对于服务的身份信息。
*证书,当ClientCredentialType被设定为证书时,默认为此项。这种元素通过使用Base64编码的X.509证书值和客户端进行比较。

当使用CardSpace作为凭据验证服务时,也使用此元素。这种元素通过“指纹”严格对证书进行验证。由于“指纹”是唯一的,所以此

验证较为严格。这就要注意,如果服务用相同的主机名重新发布证书,它就会有新的“指纹”。所以,客户端不能连接服务,除非它

知道新“指纹”。
*引用证书,与之前的证书相区别。这种元素允许指定证书名和存储获取正式的地点。与之前证书使用场景相似。好处是获取证书的地点可以改变。
*RSA 这种元素指定了和客户端进行比较的RSA键值。这种方式与证书类似,区别是不使用证书指纹,而是用RSA键来代替。RSA验证方式允许通过RSA键来验证唯一证书。如果RSA值发生变化,则客户端就不再有效。
*UPN(User principal name)。当把ClientCredentialType设定为Windows,服务进程不是运行在系统账户下时,默认为此选项。这种元素指定服务运行的UPN。具体参考Kerberos协议。这种设定允许服务运行在特定的Windows用户账户。这个用户账户既可以是现存的登录账户或一个特殊的用户账户。如果服务运行在ActiveDirectory下的域中,此设定利用了WindowsKerberos安全协议。
*SPN(Service principal name)当把ClientCredentialType设为Windows,且服务进行运行在系统账户下时,默认为此选项。本地服务,本地系统或网络服务。这种元素指定与服务账户关联的SPN。参考Kerberos协议。此设定通过SPN和关联的windows账户联合验证服务。为了服务的用户账户,你可以使用Setspn.exe工具去关联一个机器账户。This setting takes advantage of Windows Kerberos security is running under one of the system accounts or under a domain account that has an associated SPN name with it and the computer is a member of a domain with an Active Directory environment.
*为服务指定身份 一般情况下,你不需要设定服务的身份,因为传送给客户端凭据种类的选择决定了暴露在元数据中的身份类型。
*在配置文件中使用<identity>元素
If you change the client credential type in the binding previously shown to Certificate,then the generated WSDL contains a Base64 serialized X.509 centificate for the identity value as shown in the following code.默认是所有凭据类型而不只是Windows。
<Identity xmlns="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
 <X509Data>
 <X509Certificate>MIIBxjCCAXSgAwIBAgIQmXJgyu9tro1M98GifjtuoDAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTA2MDUxNzIxNDQyNVoXDTM5MTIzMTIzNTk1OVowKTEQMA4GA1UEChMHQ29udG9zbzEVMBMGA1UEAxMMaWRlbnRpdHkuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBmivcb8hYbh11hqVoDuB7zmJ2y230f/b4e+4P6yXtKKuhUdYcIqc8mAforIM4WWJEVGeJVq9sFEwqrL5Ryid8jMTRwPLvA/x/wvj1gtD1GWJ+aUh2pqieiGL7MWTepHAQBIibUxgOrAOz0j9Xhg0iDFYScdYUjeqI3yZIDC7WbwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBADB/J2QjdSPL8Doj3pAveCXd/5fY03eo9kUym/Tmb4ubdqsObri0qnYR/n8Wxsa1yJ4Dks6cNBTPS4l5B7zUeNo=</X509Certificate>
 </X509Data>
</KeyInfo>
</Identity>
编程的方式,改变设置
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
                typeof(ICalculator),
                new WSHttpBinding(),
                String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
     EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
配置文件的方式,改变设置
<configuration>
<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="WSHttpBinding_ICalculator_Windows">
        <security>
          <message clientCredentialType="Windows"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  <client>
    <endpoint address="http://localhost:8003/servicemodelsamples/service/dnsidentity"
      binding="wsHttpBinding"
      bindingConfiguration="WSHttpBinding_ICalculator_Windows"
      contract="ICalculator"
      name="WSHttpBinding_ICalculator">
      <identity>
        <dns value="contoso.com" />
      </identity>
    </endpoint>
  </client>
</system.serviceModel>
</configuration>

posted @ 2011-03-13 22:10  来日方糖  阅读(745)  评论(2编辑  收藏  举报