[索引页]
[源码下载]


化零为整WCF(17) - 安全(Security)


作者:webabcd


介绍
WCF(Windows Communication Foundation) - 安全(Security):本文以用户名和密码做验证,通过X.509证书做加密为例


示例
1、证书

setup.bat
化零为整WCF(17) - 安全(Security)makecert -sr LocalMachine -ss My -a sha1 -n CN=Webabcd -sky exchange -pe
化零为整WCF(17) - 安全(Security)certmgr -add -r LocalMachine -s My -c -n Webabcd -s TrustedPeople


2、服务
IHello.cs
化零为整WCF(17) - 安全(Security)using System;
化零为整WCF(17) - 安全(Security)
using System.Collections.Generic;
化零为整WCF(17) - 安全(Security)
using System.Linq;
化零为整WCF(17) - 安全(Security)
using System.Text;
化零为整WCF(17) - 安全(Security)
化零为整WCF(17) - 安全(Security)
using System.ServiceModel;
化零为整WCF(17) - 安全(Security)
化零为整WCF(17) - 安全(Security)
namespace WCF.ServiceLib.Security

Hello.cs
化零为整WCF(17) - 安全(Security)using System;
化零为整WCF(17) - 安全(Security)
using System.Collections.Generic;
化零为整WCF(17) - 安全(Security)
using System.Linq;
化零为整WCF(17) - 安全(Security)
using System.Text;
化零为整WCF(17) - 安全(Security)
化零为整WCF(17) - 安全(Security)
using System.ServiceModel;
化零为整WCF(17) - 安全(Security)
化零为整WCF(17) - 安全(Security)
namespace WCF.ServiceLib.Security

CustomNamePasswordValidator.cs
化零为整WCF(17) - 安全(Security)using System;
化零为整WCF(17) - 安全(Security)
using System.Collections.Generic;
化零为整WCF(17) - 安全(Security)
using System.Linq;
化零为整WCF(17) - 安全(Security)
using System.Text;
化零为整WCF(17) - 安全(Security)
化零为整WCF(17) - 安全(Security)
using System.ServiceModel;
化零为整WCF(17) - 安全(Security)
化零为整WCF(17) - 安全(Security)
namespace WCF.ServiceLib.Security


3、宿主
Hello.svc
%>

Web.config
化零为整WCF(17) - 安全(Security)<?xml version="1.0"?>
化零为整WCF(17) - 安全(Security)
<configuration>
化零为整WCF(17) - 安全(Security)    
<system.serviceModel>
化零为整WCF(17) - 安全(Security)        
<services>
化零为整WCF(17) - 安全(Security)            
<!--name - 提供服务的类名-->
化零为整WCF(17) - 安全(Security)            
<!--behaviorConfiguration - 指定相关的行为配置-->
化零为整WCF(17) - 安全(Security)            
<service name="WCF.ServiceLib.Security.Hello" behaviorConfiguration="SecurityBehavior">
化零为整WCF(17) - 安全(Security)                
<!--address - 服务地址-->
化零为整WCF(17) - 安全(Security)                
<!--binding - 通信方式-->
化零为整WCF(17) - 安全(Security)                
<!--contract - 服务契约-->
化零为整WCF(17) - 安全(Security)                
<endpoint address="" binding="wsHttpBinding" contract="WCF.ServiceLib.Security.IHello" bindingConfiguration="SecurityBindingConfiguration"  />
化零为整WCF(17) - 安全(Security)            
</service>
化零为整WCF(17) - 安全(Security)        
</services>
化零为整WCF(17) - 安全(Security)        
<behaviors>
化零为整WCF(17) - 安全(Security)            
<serviceBehaviors>
化零为整WCF(17) - 安全(Security)                
<behavior name="SecurityBehavior">
化零为整WCF(17) - 安全(Security)                    
<!--httpGetEnabled - 指示是否发布服务元数据以便使用 HTTP/GET 请求进行检索,如果发布 WSDL,则为 true,否则为 false,默认值为 false-->
化零为整WCF(17) - 安全(Security)                    
<serviceMetadata httpGetEnabled="true" />
化零为整WCF(17) - 安全(Security)                    
<serviceDebug includeExceptionDetailInFaults="true"/>
化零为整WCF(17) - 安全(Security)                    
<serviceCredentials>
化零为整WCF(17) - 安全(Security)                        
<!--userNamePasswordValidationMode - 以用户名/密码模式来进行验证的方法-->
化零为整WCF(17) - 安全(Security)                        
<!--UserNamePasswordValidationMode.Windows - 用户名映射到 Windows 用户-->
化零为整WCF(17) - 安全(Security)                        
<!--UserNamePasswordValidationMode.MembershipProvider - 提供基于已配置的 MembershipProvider 的密码验证-->
化零为整WCF(17) - 安全(Security)                        
<!--UserNamePasswordValidationMode.Custom - 基于已配置的自定义 UsernamePasswordValidator 的自定义身份验证-->
化零为整WCF(17) - 安全(Security)                        
<!--customUserNamePasswordValidatorType - 所使用的自定义用户名密码验证程序的类型-->
化零为整WCF(17) - 安全(Security)                        
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCF.ServiceLib.Security.CustomNamePasswordValidator, WCF.ServiceLib" />
化零为整WCF(17) - 安全(Security)                        
<!--findValue - 指定要在 X.509 证书存储区中搜索的值-->
化零为整WCF(17) - 安全(Security)                        
<!--storeLocation - 指定客户端可用于验证服务器证书的证书存储区位置(LocalMachine - 分配给本地计算机的 X.509 证书存储区;CurrentUser - 当前用户使用的 X.509 证书存储区)-->
化零为整WCF(17) - 安全(Security)                        
<!--storeName - 要打开的 X.509 证书存储区的名称(参看:StoreName枚举。AddressBook, AuthRoot, CertificateAuthority, Disallowed, My, Root, TrustedPeople, TrustedPublisher)-->
化零为整WCF(17) - 安全(Security)                        
<!--x509FindType - 要执行的 X.509 搜索的类型(参看:X509FindType枚举)-->
化零为整WCF(17) - 安全(Security)                        
<serviceCertificate findValue="Webabcd" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
化零为整WCF(17) - 安全(Security)                    
</serviceCredentials>
化零为整WCF(17) - 安全(Security)                
</behavior>
化零为整WCF(17) - 安全(Security)            
</serviceBehaviors>
化零为整WCF(17) - 安全(Security)        
</behaviors>
化零为整WCF(17) - 安全(Security)        
<bindings>
化零为整WCF(17) - 安全(Security)            
<wsHttpBinding>
化零为整WCF(17) - 安全(Security)                
<binding name="SecurityBindingConfiguration">
化零为整WCF(17) - 安全(Security)                    
<security>
化零为整WCF(17) - 安全(Security)                        
<!--clientCredentialType - 客户端用以进行身份验证的凭据的类型,默认值 UserName -->
化零为整WCF(17) - 安全(Security)                        
<!--BasicHttpMessageCredentialType.UserName - 使用用户名凭据对客户端进行身份验证-->
化零为整WCF(17) - 安全(Security)                        
<!--BasicHttpMessageCredentialType.Certificate - 使用证书对客户端进行身份验证-->
化零为整WCF(17) - 安全(Security)                        
<message clientCredentialType="UserName" />
化零为整WCF(17) - 安全(Security)                    
</security>
化零为整WCF(17) - 安全(Security)                
</binding>
化零为整WCF(17) - 安全(Security)            
</wsHttpBinding>
化零为整WCF(17) - 安全(Security)        
</bindings>
化零为整WCF(17) - 安全(Security)    
</system.serviceModel>
化零为整WCF(17) - 安全(Security)
</configuration>
化零为整WCF(17) - 安全(Security)


4、客户端
Hello.aspx

Hello.aspx.cs
化零为整WCF(17) - 安全(Security)using System;
化零为整WCF(17) - 安全(Security)
using System.Collections;
化零为整WCF(17) - 安全(Security)
using System.Configuration;
化零为整WCF(17) - 安全(Security)
using System.Data;
化零为整WCF(17) - 安全(Security)
using System.Linq;
化零为整WCF(17) - 安全(Security)
using System.Web;
化零为整WCF(17) - 安全(Security)
using System.Web.Security;
化零为整WCF(17) - 安全(Security)
using System.Web.UI;
化零为整WCF(17) - 安全(Security)
using System.Web.UI.HtmlControls;
化零为整WCF(17) - 安全(Security)
using System.Web.UI.WebControls;
化零为整WCF(17) - 安全(Security)
using System.Web.UI.WebControls.WebParts;
化零为整WCF(17) - 安全(Security)
using System.Xml.Linq;
化零为整WCF(17) - 安全(Security)
化零为整WCF(17) - 安全(Security)
public partial class Sample_Security : System.Web.UI.Page

Web.config
化零为整WCF(17) - 安全(Security)<?xml version="1.0"?>
化零为整WCF(17) - 安全(Security)
<configuration>
化零为整WCF(17) - 安全(Security)    
<system.serviceModel>
化零为整WCF(17) - 安全(Security)        
<client>
化零为整WCF(17) - 安全(Security)            
<!--address - 服务地址-->
化零为整WCF(17) - 安全(Security)            
<!--binding - 通信方式-->
化零为整WCF(17) - 安全(Security)            
<!--contract - 服务契约-->
化零为整WCF(17) - 安全(Security)            
<!--bindingConfiguration - 指定相关的绑定配置-->
化零为整WCF(17) - 安全(Security)            
<!--behaviorConfiguration - 指定相关的行为配置-->
化零为整WCF(17) - 安全(Security)            
<endpoint address="http://localhost:3502/ServiceHost/Security/Hello.svc"
化零为整WCF(17) - 安全(Security)                binding
="wsHttpBinding"
化零为整WCF(17) - 安全(Security)                contract
="SecuritySvc.IHello"
化零为整WCF(17) - 安全(Security)                bindingConfiguration
="HelloBindingConfiguration"
化零为整WCF(17) - 安全(Security)                behaviorConfiguration
="HelloBehaviorConfiguration">
化零为整WCF(17) - 安全(Security)                
<identity>
化零为整WCF(17) - 安全(Security)                    
<!--encodedValue - 此证书编码的值。公钥,用于加密用户名和密码。测试时,请根据实际情况修改此值-->
化零为整WCF(17) - 安全(Security)                    
<certificate encodedValue="AwAAAAEAAAAUAAAAwMJESjc9Bbgeh9hIrrdrlMz0nfEgAAAAAQAAALMBAAAwggGvMIIBXaADAgECAhBC+dqPonX5pEwDPMLbdE9MMAkGBSsOAwIdBQAwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3kwHhcNMDgwNzE1MDczODIwWhcNMzkxMjMxMjM1OTU5WjASMRAwDgYDVQQDEwdXZWJhYmNkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwfrBPcMSOWVJmDnn+EFfCOslH0OqC5s67C6e19XQ7oMh6a9hP9Os4hefNoGxcdPK3orV4y4pHn0VOvHgaeAJqreRjmgmyb+h2BDB7nkmhchBxQZUx4jSX0GUrqECZm9uUMrNq8vx7NtaEuEMs5q50KPaxrv6PwuKLssNnb3WC1wIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAE/6rAQhU3X1RficEHPEeUAX7HQQXZDYByQt0QqE7C8PaViQWlWU+Sp8u9Oy3ce4DSg3wgQLL/DIknG7FMIiGRE=" />
化零为整WCF(17) - 安全(Security)                
</identity>
化零为整WCF(17) - 安全(Security)            
</endpoint>
化零为整WCF(17) - 安全(Security)        
</client>
化零为整WCF(17) - 安全(Security)        
<bindings>
化零为整WCF(17) - 安全(Security)            
<wsHttpBinding>
化零为整WCF(17) - 安全(Security)                
<binding name="HelloBindingConfiguration">
化零为整WCF(17) - 安全(Security)                    
<security>
化零为整WCF(17) - 安全(Security)                        
<!--clientCredentialType - 客户端用以进行身份验证的凭据的类型,默认值 UserName -->
化零为整WCF(17) - 安全(Security)                        
<!--BasicHttpMessageCredentialType.UserName - 使用用户名凭据对客户端进行身份验证-->
化零为整WCF(17) - 安全(Security)                        
<!--BasicHttpMessageCredentialType.Certificate - 使用证书对客户端进行身份验证-->
化零为整WCF(17) - 安全(Security)                        
<message clientCredentialType="UserName" />
化零为整WCF(17) - 安全(Security)                    
</security>
化零为整WCF(17) - 安全(Security)                
</binding>
化零为整WCF(17) - 安全(Security)            
</wsHttpBinding>
化零为整WCF(17) - 安全(Security)        
</bindings>
化零为整WCF(17) - 安全(Security)        
<behaviors>
化零为整WCF(17) - 安全(Security)            
<endpointBehaviors>
化零为整WCF(17) - 安全(Security)                
<behavior name="HelloBehaviorConfiguration">
化零为整WCF(17) - 安全(Security)                    
<clientCredentials>
化零为整WCF(17) - 安全(Security)                        
<serviceCertificate>
化零为整WCF(17) - 安全(Security)                            
<!--authentication - 证书验证模式 -->
化零为整WCF(17) - 安全(Security)                            
<!--X509CertificateValidationMode.None - 不使用证书验证-->
化零为整WCF(17) - 安全(Security)                            
<!--X509CertificateValidationMode.PeerTrust - 如果证书位于被信任的人的存储区中,则有效-->
化零为整WCF(17) - 安全(Security)                            
<!--X509CertificateValidationMode.ChainTrust - 如果该链在受信任的根存储区生成证书颁发机构,则证书有效-->
化零为整WCF(17) - 安全(Security)                            
<!--X509CertificateValidationMode.PeerOrChainTrust -如果证书位于被信任的人的存储区或该链在受信任的根存储区生成证书颁发机构,则证书有效 -->
化零为整WCF(17) - 安全(Security)                            
<!--X509CertificateValidationMode.Custom -用户必须插入自定义 X509CertificateValidator 以验证证书 -->
化零为整WCF(17) - 安全(Security)                            
<authentication certificateValidationMode="PeerTrust" />
化零为整WCF(17) - 安全(Security)                        
</serviceCertificate>
化零为整WCF(17) - 安全(Security)                    
</clientCredentials>
化零为整WCF(17) - 安全(Security)                
</behavior>
化零为整WCF(17) - 安全(Security)            
</endpointBehaviors>
化零为整WCF(17) - 安全(Security)        
</behaviors>
化零为整WCF(17) - 安全(Security)    
</system.serviceModel>
化零为整WCF(17) - 安全(Security)
</configuration>
化零为整WCF(17) - 安全(Security)


运行结果:
单击"btnSayHello"按钮,显示"Hello: webabcd"。经过加密的用户名和密码放在SOAP头中传输。


OK
[源码下载]

相关文章: